Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
wxpython-外部文件中的绑定事件_Python_Wxpython - Fatal编程技术网

wxpython-外部文件中的绑定事件

wxpython-外部文件中的绑定事件,python,wxpython,Python,Wxpython,我试图将GUI文件中的事件绑定到另一个文件(实际上是“前端”和“后端”)中的代码。我可以让后端和前端在同一个文件中工作,但当我尝试将它们移动到单独的文件中时,我无法让后端看到前端的部分(标签、按钮等) 也就是说,我需要后端代码来更改标签和做数学之类的事情,这需要影响GUI 我已经提供了我的程序的一个简单版本。除了我试图让后端看到GUI的各个部分时遇到的错误之外,所有的工作都正常 mainfile.py 标签_.py 我想要它做的只是更改GUI的标签,但使用一个外部文件 我这样做主要是为了保持我的

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

也就是说,我需要后端代码来更改标签和做数学之类的事情,这需要影响GUI

我已经提供了我的程序的一个简单版本。除了我试图让后端看到GUI的各个部分时遇到的错误之外,所有的工作都正常

mainfile.py 标签_.py 我想要它做的只是更改GUI的标签,但使用一个外部文件

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


提前谢谢

执行此操作的常用方法是和pubsub。看看这个。

这个

btn.Bind(wx.EVT_BUTTON,label_changer.change_label(self))
需要

btn.Bind(wx.EVT_BUTTON,label_changer.change_label)
def change_label(event):
    panel = event.GetEventObject().GetParent()
    panel.lbl.SetLabel("barfoo")
还有这个

def change_label(self):
    self.p.lbl.SetLabel("barfoo")
需要

btn.Bind(wx.EVT_BUTTON,label_changer.change_label)
def change_label(event):
    panel = event.GetEventObject().GetParent()
    panel.lbl.SetLabel("barfoo")
为了澄清,您需要将对函数的引用传递到
Bind
,该函数将在事件发生时调用。wx将始终向这些函数传递一个参数-事件。您通常在回调中看到的
self
是它们作为绑定方法的副产品。每个绑定方法(过于简化,在类中定义的函数)在调用时都会隐式传递第一个参数,该参数是对类实例的引用。因此,由于无法通过“外部”函数中的传统方式访问此实例,因此必须通过事件对象访问它


还有一件事,您并没有真正以这种方式将gui与逻辑分离。这是因为逻辑(本例中的标签更改器)需要了解gui并直接操作它。有很多方法可以实现更强大的分离(st2053暗示了其中的一种),但是对于一个相对较小的程序,如果您现在不想,您不需要麻烦,只需将代码拆分为多个文件并专注于完成任务就可以了。您可以稍后再考虑体系结构。

一种解决方案是修改
change\u 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))
在进行绑定之前,请确保定义了
self.lbl


有关将参数传递给回调的详细信息,请参见

,虽然这会起作用,但在我看来,这不是一个特别好的解决方案。这要求
change\u label
了解其他模块的一些信息——具体地说,标签名为“lbl”,并且位于事件对象的父对象中。如果修改了主文件,可能还需要更改label_changer.py文件,这会增加您的维护成本。我认为这将是一种方法。。。我现在正在读它。。。谢谢你的回答!