我的应用中有多个面板,位于wx.Notebook
。为了便于说明,假设我在名为LaunchPanel
的文件中有一个名为launchTab
的面板,在名为ScanPanel
的文件中有一个名为scanTab
的面板。
我在ScanPanel
上有一个可以锁定GUI一段时间的按钮,所以当长时间运行的任务开始时,我正在禁用面板上的每个小部件。一切正常。但是我现在要禁用其他面板中的其他内容,如果用户使用鼠标左键快速触发,可能会发生冲突。我发现您可以使用panel.Disable()
禁用面板,但我不知道如何在Disable
内为LaunchPanel中的面板调用ScanPanel
。
我已在import launchTab
内尝试launchTab
来访问ScanPanel
:
import launchTab
...
launchTab.LaunchPanel.Disable()
但是收到此错误:
TypeError: unbound method Disable() must be called with LaunchPanel instance as first argument (got nothing instead)
我认为答案是一个pubsub,但我不知道如何设置一个与面板的muck,我只是用它们更新一个小部件......?目前有大量的源代码,所以我不想粘贴所有的源代码,但如果需要,我可以提供更多的说明。
帮助?想法?
编辑低于答案:
所以 - 我不太确定我理解......应用程序中有以下组件。 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
我已经尝试了下面的答案,但我认为因为我的init使用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
答案 0 :(得分:2)
您得到的错误是因为您正在调用类的方法而没有该类对象的实例。
您需要将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中,您可以引用您可以调用disable on的launchPanel对象。
这有意义吗?
<强> EDITS 强>
我猜您希望能够从“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")