python - wxpython - 在外部文件中绑定(bind)事件

标签 python wxpython

我正在尝试绑定(bind)来自 GUI 文件的事件以使用来自另一个文件(实际上是“前端”和“后端”)的代码。我可以让后端和前端在同一个文件中工作,但是当我尝试将它们移动到单独的文件中时,我无法让后端查看前端的部分(标签、按钮等)。

我。 E. 我需要后端代码来更改标签和进行数学运算等,它需要影响 GUI。

我已经提供了我的程序的一个简单版本。除了我在尝试让后端看到 GUI 的部分时遇到的错误外,一切正常。

主文件.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import wx

import label_changer

class foopanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, id=wx.ID_ANY)

        box = wx.BoxSizer()
        btn = wx.Button(self,1,"Press")
        btn.Bind(wx.EVT_BUTTON,label_changer.change_label(self))
        box.Add(btn)

        self.lbl = wx.StaticText(self,1,"Foobar")
        box.Add(self.lbl)

        self.SetSizerAndFit(box)

class main_frame(wx.Frame):
    """Main Frame holding the main panel."""
    def __init__(self,*args,**kwargs):
        wx.Frame.__init__(self,*args,**kwargs)

        sizer = wx.BoxSizer()

        self.p = foopanel(self)

        sizer.Add(self.p,1)

        self.Show()

if __name__ == "__main__":
    app = wx.App(False)
    frame = main_frame(None,-1,)
    app.MainLoop()

label_changer.py
def change_label(self):
    self.p.lbl.SetLabel("barfoo")

我想要它做的就是更改 GUI 的标签,但使用外部文件。

我这样做主要是为了让我的代码保持独立,只是作为一种学习体验。

提前致谢!

最佳答案

一种解决方案是修改 change_label 以接受标识要更改的标签的参数。例如:

def change_label(event, label):
    label.SetLabel("barfoo")

然后,使用 lambda 创建一个回调,将参数传入:

btn.Bind(wx.EVT_BUTTON, label_changer, 
    lambda event, label=self.p.lbl: label_changer.change_label(event, label))

确保在进行绑定(bind)之前定义了 self.lbl

有关将参数传递给回调的更多信息,请参阅 Passing Arguments to CallbacksWxPyWiki

关于python - wxpython - 在外部文件中绑定(bind)事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5974428/

相关文章:

python - 随机播放按行聚合的列表字典

python - 无法运行使用 cx-freeze 创建的 exe

python - wxpython 如何设置对话框大小适合对话框中的数据?

python - 如何将变量传递给主机?

python - wxPython:动态启用和禁用小部件,从 csv 文件获取设置

python - wxpython:检测对话框是否已关闭

python - ModelMultipleChoiceField 上的 Django 多值

Python:Factory Boy 生成对象创建时指定的长度列表

python - wx Python 小部件是否对整个窗口(全局)的鼠标点击使用react?

python - 有没有办法只从 tkFileDialog 获取文件名?