wxPython:从其他面板禁用Panel

时间:2011-08-20 15:08:06

标签: user-interface wxpython panel

我的应用中有多个面板,位于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

1 个答案:

答案 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")