我正在尝试绑定(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 Callbacks在 WxPyWiki
关于python - wxpython - 在外部文件中绑定(bind)事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5974428/