首页 > 编程问答 >如何在 wxPython 的 for 循环中添加文本输入框?

如何在 wxPython 的 for 循环中添加文本输入框?

时间:2024-07-28 12:16:58浏览次数:9  
标签:python matplotlib user-interface wxpython

我是 wxPython 的新手,正在开发一个带有 GUI 的基本程序,让用户标记图像。现在,当用户单击“导入”按钮时,他们可以选择一个目录。然后,代码使用 matplotlib 在 for 循环中显示该目录中的每个图像。但是,我不知道如何在 for 循环中访问用户输入。这就是该函数现在的样子:

import matplotlib.pyplot as plt
import io
import os
import wx 

#This function is appended to an "Import" menu item in the frame's menu bar

def OnClick(self, event):
    dlg = wx.DirDialog(self, "Specify folder:", style=wx.DD_DEFAULT_STYLE)
    results = []
    if dlg.ShowModal() == wx.ID_OK:
        folder = dlg.GetPath()
        for image in os.listdir(folder):
            im = plt.imread(image)
            plt.imshow(im)
            buf = io.BytesIO()
            plt.savefig(buf,format='png')
            buf.seek(0)
            self.Image = wx.Image(buf, wx.BITMAP_TYPE_ANY)
            self.Image = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap(self.Image))
            self.sizer = wx.BoxSizer(wx.HORIZONTAL)
            self.sizer.Add(self.Image,1,wx.ALIGN_CENTRE)
            self.SetSizer(self.sizer)
            #Getting the input works but it's obviously not part of the GUI
            #Ideally, I would like to create a text box after each image is displayed
            #Then, once the input is submitted, return to the top of the loop
            label = input('Enter label for image:').lower()
            results.append([image, label])

现在,作为占位符,我正在使用 input() 在终端中获取用户输入。效果很好,但我宁愿让该条目成为 wxPython GUI 的一部分。我想知道是否有人知道一种在 for 循环中创建文本条目、获取输入、然后删除/清除该输入并获取新输入的方法。

我尝试过:

ipt = wx.TextEntryDialog()
ipt.ShowModal()
result = ipt.GetValue()
ipt.Destroy()

但该框从未出现。


你几乎找到了解决方案!问题在于你正在循环中创建和显示对话框,但之后没有为对话框处理事件。你需要为每个图像创建一个包含图像和文本框的新小部件,然后处理每个文本框的事件。

这是一个修改后的代码版本,它可以做到这一点:

import matplotlib.pyplot as plt
import io
import os
import wx 

class ImageLabeler(wx.Frame):
    def __init__(self, parent, title):
        super().__init__(parent, title=title, size=(800, 600))
        self.panel = wx.Panel(self)
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.panel.SetSizer(self.sizer)

    def OnClick(self, event):
        dlg = wx.DirDialog(self, "Specify folder:", style=wx.DD_DEFAULT_STYLE)
        if dlg.ShowModal() == wx.ID_OK:
            folder = dlg.GetPath()
            for image in os.listdir(folder):
                self.add_image_and_label(image)

    def add_image_and_label(self, image_path):
        im = plt.imread(image_path)
        plt.imshow(im)
        buf = io.BytesIO()
        plt.savefig(buf, format='png')
        buf.seek(0)

        image = wx.Image(buf, wx.BITMAP_TYPE_ANY)
        bitmap = wx.StaticBitmap(self.panel, wx.ID_ANY, wx.Bitmap(image))

        label_text = wx.StaticText(self.panel, label="Label:")
        text_ctrl = wx.TextCtrl(self.panel)

        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add(bitmap, 1, wx.ALIGN_CENTER)
        hbox.Add(label_text, 0, wx.ALL, 5)
        hbox.Add(text_ctrl, 1, wx.ALL, 5)

        self.sizer.Add(hbox, 0, wx.ALL, 5)
        self.sizer.Fit(self)

        # 为每个文本框绑定一个事件处理函数
        text_ctrl.Bind(wx.EVT_TEXT_ENTER, self.on_label_entered)

    def on_label_entered(self, event):
        # 获取输入的标签和对应的图像文件名
        text_ctrl = event.GetEventObject()
        label = text_ctrl.GetValue()

        # 在这里你可以处理标签,例如将其保存到一个列表中
        print(f"Label entered: {label}")

app = wx.App()
frame = ImageLabeler(None, 'Image Labeler')
frame.Show()
app.MainLoop()

代码解释:

  1. ImageLabeler 类:
  2. 我们创建了一个名为 ImageLabeler 的自定义框架类来容纳我们的应用程序逻辑。
  3. 它包含一个面板 ( self.panel ) 和一个垂直布局管理器 ( self.sizer ) 来组织图像和标签。
  4. OnClick 方法:
  5. 该方法与之前相同,它打开一个目录对话框并迭代选定文件夹中的图像。
  6. 对于每个图像,它调用 add_image_and_label 方法。
  7. add_image_and_label 方法:
  8. 该方法加载图像,创建一个 wx.StaticBitmap 来显示它,并创建一个 wx.TextCtrl 用于输入标签。
  9. 它使用 wx.BoxSizer 将图像、标签和文本框水平排列。
  10. 最后,它将这个水平布局添加到主垂直布局 ( self.sizer ) 中。
  11. on_label_entered 方法:
  12. 这是绑定到每个文本框 wx.EVT_TEXT_ENTER 事件的新事件处理函数。当用户在文本框中按下 Enter 键时,将调用此函数。
  13. 在此函数中,你可以获取输入的标签值并将其与相应的图像相关联。

这个修改后的代码将在窗口中显示图像和标签输入框。你可以在 on_label_entered 方法中添加代码来处理用户输入的标签。

标签:python,matplotlib,user-interface,wxpython
From: 78802936

相关文章

  • 【Python】字母 Rangoli 图案
    一、题目YouaregivenanintegerN.YourtaskistoprintanalphabetrangoliofsizeN.(RangoliisaformofIndianfolkartbasedoncreationofpatterns.)Differentsizesofalphabetrangoliareshownbelow:#size3----c------c-b-c--c-b-a-b-c--c......
  • python 闭包、装饰器
    一、闭包:1.外部函数嵌套内部函数 2.外部函数返回内部函数 3.内部函数可以访问外部函数局部变量         闭包(Closure)是指在一个函数内部定义的函数,并且内部函数可以访问外部函数的局部变量,即使外部函数已经执行完毕,这种现象称为闭包。在Python中,闭包常常用......
  • 掌握 IPython %%time 魔法命令:高效测量代码块执行时间
    引言在编程和数据分析中,了解代码的执行时间是优化性能的关键步骤。IPython,作为一个强大的交互式计算环境,提供了多种工具来帮助用户测量和优化代码。其中,%%time魔法命令是IPython中用来测量代码块执行时间的便捷工具。本文将详细介绍%%time魔法命令的使用方法,并通过一......
  • 探索 IPython 中的 %%javascript 魔法命令:运行 JavaScript 代码的秘籍
    引言IPython是一个强大的交互式计算环境,它不仅支持Python语言,还通过各种魔法命令扩展了其功能。其中,%%javascript魔法命令是IPython扩展中一个非常有趣的特性,它允许用户在IPython环境中直接运行JavaScript代码。这对于需要在数据科学和科学计算中使用JavaScript......
  • pythonasm库分析,看看你和自学编程小学生的差距
    下面是pythonasm.asm库的源代码fromkeystoneimport*fromcapstoneimport*assembly_instructions=[]#储存汇编指令的列表#汇编指令写入列表defmov(reg1,reg2):assembly_instructions.append(f"mov{reg1},{reg2}")defdb(value):assembly_instructio......
  • 【Python系列】Python 中的垃圾收集:深入理解与实践
    ......
  • Python酷库之旅-第三方库Pandas(050)
    目录一、用法精讲181、pandas.Series.var方法181-1、语法181-2、参数181-3、功能181-4、返回值181-5、说明181-6、用法181-6-1、数据准备181-6-2、代码示例181-6-3、结果输出182、pandas.Series.kurtosis方法182-1、语法182-2、参数182-3、功能182-4、返回值1......
  • 使用 python matplotlib 和 metpy 添加辅助 y 轴
    我知道这个问题似乎与这里的许多其他问题类似,但我已经尝试过它们,不幸的是它们都没有解决我在尝试添加辅助y轴时当前面临的问题。问题是很简单,但我找不到任何可以修复它的东西:在SkewT图上添加辅助y轴会更改图的y限制,而不仅仅是添加轴。基本上,我希望添加辅......
  • Python实现基于卷积神经网络的恶意代码分类系统(设计思路概述)
    这个设计是关于一个基于卷积神经网络(CNN)的恶意代码分类系统,其主要目标是对恶意代码进行自动分类,帮助用户识别并防范不同类型的恶意软件。以下是该系统的设计思路、方法及实现过程的详细解释:设计思路恶意代码图像化:由于直接对恶意代码的源代码或二进制形式进行分类难度较......
  • Python实现基于卷积神经网络的恶意代码分类系统
    目录摘要IABSTRACTII1绪论11.1研究背景与意义11.2国内外研究现状21.3技术路线32相关知识背景52.1恶意代码检测概述52.2深度学习技术基础62.2.1卷积神经网络基本结构72.2.2激活72.2.3池化83基于卷积神经网络的恶意代码分类方法103.1卷......