Python 从不同文件绑定事件

1 投票
1 回答
545 浏览
提问于 2025-04-18 14:11

我刚开始学习Python,正在尝试制作一个桌面应用程序,用来记录表单中的信息。我想创建几个面板对象,这些面板我会在不同的界面中重复使用,并且我希望能在MyFrame类中绑定一个事件到这个面板对象上。不过我不太确定这样做是否可行。以下是我的代码:

main.py:

import wx
from testPanel import testPanel

class MyFrame(wx.Frame):
    def OnClick(self,event):
        print "Clicked"

    def __init__(self, parent, ID, title):
        wx.Frame.__init__(self, parent, ID, title=title, size=(500,200))
        ...
        myList = ['Project1', 'Project2', 'Project3', 'Project4']
        myPanel = testPanel(self,-1,name="myPanel",lbl="Label: ", List=myList)
        self.authorTxt = wx.TextCtrl(self, size=(140,-1))
        self.button =wx.Button(self, label="Save")
        self.Bind(wx.EVT_BUTTON, self.OnClick, self.button)
        ...
        box = wx.BoxSizer(wx.VERTICAL)
        box.Add(myPanel, 1, wx.EXPAND)
        box.Add(self.authorTxt, 1, wx.EXPAND)
        box.Add(self.button, 1, wx.EXPAND)
        ...

testPanel.py

import wx
class testPanel(wx.Panel):
    def EvtComboBox(self, event):
        print"%s was selected" % event.GetString()

    def __init__(self, parent, ID, name, lbl, List = []):
        wx.Panel.__init__(self, parent, ID)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        lbl = wx.StaticText(self, label=lbl, size=(-1,1))
        cb = wx.ComboBox(self, size=(-1, 1), choices=List, style=wx.CB_DROPDOWN)
        self.Bind(wx.EVT_COMBOBOX, self.EvtComboBox, cb)
        ...

我想让文本框“authorTxt”根据选择的下拉框(ComboBox)项来决定是否可以编辑。有没有办法在main.py中绑定testPanel.py中的下拉框事件呢?

非常感谢任何帮助!

1 个回答

1

我觉得你想要的是这个:

首先,当你在testPanel中定义cb的时候,应该这样做:

self.cb = ...

然后你可以这样做:

self.Bind(wx.EVT_COMBOBOX, self.EvtComboBox, myPanel.cb)

这里的self.EvtComboBox是你需要在MyFrame中定义的一个新函数。

话说回来,我强烈建议你在这种情况下使用PubSub:

http://wiki.wxpython.org/WxLibPubSub

http://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern

编辑:cb需要成为testPanel的一个成员。

撰写回答