我的应用程序中有多个面板,它们驻留在一个wx.Notebook中。为了便于说明,假设我在一个名为launchTab的文件中有一个名为LaunchPanel的面板,在一个名为scanTab的文件中有一个名为ScanPanel的面板。
我在ScanPanel上有一个按钮,可以锁定图形用户界面一段时间,所以当长时间运行的任务开始时,我现在会禁用面板上的每个小部件。这一切都运行得很好。但我现在想禁用其他面板中的其他东西,如果用户使用鼠标左键触发,可能会发生冲突。我发现可以使用panel.Disable()禁用面板,但我不知道如何从ScanPanel中调用LaunchPanel中面板的Disable。
我尝试过从launchTab内部使用import launchTab来访问ScanPanel
import launchTab
...
launchTab.LaunchPanel.Disable()但是会出现这个错误:TypeError: unbound method Disable() must be called with LaunchPanel instance as first argument (got nothing instead)
我认为答案是一个pubsub,但是我不知道如何设置一个与面板相匹配的pubsub,我只使用它们来更新小部件...?目前有大量的源码,所以我不想全部粘贴,但如果需要的话,我可以提供更多的说明。
帮助?有什么想法?
按以下答案编辑:
所以--我不太确定我是否理解...该应用程序有以下组件。myAppGUI.py:
class myNotebook(wx.Notebook):
"""
The core layout for the app -- notebook pages are slotted here
"""
#----------------------------------------------------------------------
def __init__(self, parent):
wx.Notebook.__init__(self, parent, id=wx.ID_ANY, style=wx.BK_DEFAULT)
self.AddPage(launchTab.LaunchPanel(self), "Launch")
self.AddPage(scanTab.ScanPanel(self), "Scan")
self.AddPage(extractTab.ExtractPanel(self), "Extract")
self.AddPage(virtualsTab.VirtualsPanel(self), "Virtuals")这是启动我所有其他笔记本标签的主文件。然后,我有了,launchTab:
class LaunchPanel(wx.Panel):
"""
Launch Tab for finding and launching databases
"""
#----------------------------------------------------------------------
def __init__(self, parent):
""""""
wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
super(LaunchPanel, self)
self.initialize()
def initialize(self):
global sizer
panel = self
sizer = wx.GridBagSizer(11, 3)
<snip>然后我有了,scanTab:
class ScanPanel(wx.Panel):
"""
Scan Tab for running Sonospy Database Scans, Updates and Repairs
"""
#----------------------------------------------------------------------
def __init__(self, parent):
""""""
wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
panel = self
sizer = wx.GridBagSizer(6, 5)
self.launchPanelRef = None我已经尝试了下面的答案,但我认为由于我的初始化使用的是parent=parent (我最初在其他地方使用了示例代码以使其正常工作),我得到了以下错误:
File "gui/scanTab.py", line 223, in __init__
launchPanel = launchTab.LaunchPanel()
TypeError: __init__() takes exactly 2 arguments (1 given)当你说放入:
def main():
scanPanel = ScanPanel()
launchPanel = LaunchPanel()
scanPanel.setInstanceLaunchPanel(launchPanel)这是否包含在scanTab中?在这种情况下,launchPanelRef是否是我想要控制的面板的名称?
对不起--我很容易被弄糊涂。:)
-Chow
发布于 2011-08-21 00:08:57
您得到的错误是因为您正在调用一个类的方法,而没有该类的对象的实例。
您需要将LaunchPanel类的实例( LaunchPanel对象)传递给ScanPanel类。
class ScanPanel:
def __init__:
self.launchPanelRef = None
<snip>
def setInstanceLaunchPanel(launchPanelRef):
self.launchPanelRef = launchPanelRef
def main():
scanPanel = ScanPanel()
launchPanel = LaunchPanel()
scanPanel.setInstanceLaunchPanel(launchPanel)现在,在ScanPanel中,您有一个对launchPanel对象的引用,您可以在该对象上调用disable。
这有什么意义吗?
编辑
我猜您希望能够禁用"scanPanel“中的"launchPanel”,对吧?您需要将setInstanceLaunchPanel添加到“扫描”面板。它所做的一切都允许您存储对启动面板的引用。这意味着在扫描面板中,您将能够控制启动面板实例。
class myNotebook(wx.Notebook):
"""
The core layout for the app -- notebook pages are slotted here
"""
#----------------------------------------------------------------------
def __init__(self, parent):
wx.Notebook.__init__(self, parent, id=wx.ID_ANY, style=wx.BK_DEFAULT)
launchPanel = launchTab.LauchPanel(self) #init launchPanel
scanPanel = scanTab.ScanPanel(self) #init scanPanel
scanPanel.setInstanceLaunchPanel(launchPanel) #store reference to launchPanel in scanPanel
self.AddPage(launchPanel, "Launch") #add launchPanel to notebook
self.AddPage(scanPanel, "Scan") #add scanPanel to notebook
self.AddPage(extractTab.ExtractPanel(self), "Extract") #init extractPanel and add to notebook
self.AddPage(virtualsTab.VirtualsPanel(self), "Virtuals")https://stackoverflow.com/questions/7132596
复制相似问题