2011-08-20 59 views
0

我的应用中有多个面板,位于wx.Notebook中。为了说明起见,我们假设我在名为launchTab的文件中有一个名为LaunchPanel的面板,在名为scanTab的文件中有一个名为ScanPanel的面板。wxPython:从不同面板中禁用面板

我在ScanPanel上有一个按钮,可以锁定GUI一段时间,所以当前长时间运行任务启动时,我正在禁用面板上的每个小部件。这一切工作正常。但是现在我想禁用其他面板中的其他事物,如果用户使用鼠标左键触发快乐,可能会发生冲突。我发现你可以用panel.Disable()禁用一个面板,但是我不知道如何从ScanPanel中调用Disable作为LaunchPanel中的面板。

我试过import launchTablaunchTab内以访问ScanPanel

import launchTab 
... 
launchTab.LaunchPanel.Disable() 

,但得到这个错误: TypeError: unbound method Disable() must be called with LaunchPanel instance as first argument (got nothing instead)

我想答案是发布订阅,但我不知道如何设置一个与面板混杂,我只用它们来更新小部件......?目前有大量的源代码,所以我不想粘贴所有的代码,但如果需要,我可以提供更多的说明。

帮助?思考?

编辑按照以下解答:

所以 - 我不太确定我明白......有下列组件的应用程序。 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使用父父=(我脱下示例代码别的地方把它原来的工作),我收到以下错误:

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

根据您的添加内容查看补充内容。您将受益于一些面向对象的教程。 – Mark

+0

Heh。我会从很多事情中受益。我是那些通过这种方式学习的人中的一员 - 我有很多关于这个主题的书籍,而我的Python体验现在大约有4周的时间。 :) – chow

回答

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中,您可以引用您的launchPanel对象,您可以调用disable on。

这是否有意义?

EDITS

我猜你希望能够禁用 “launchPanel”,从 “scanPanel”,对不对? 您需要将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") 
+0

请参阅上文。 :) – chow

+0

绝对适用于存储对面板本身的引用。我无法通过self.launchRef.Disable()将面板设置为Disable(),即使通过它也没有出错。我还尝试在ScanPanel中修改launchTab面板上的文本控件,并更新它,但不会重新绘制面板。事实上,接受答案就是存储相关信息,但是我需要学习更多的东西来解决这个问题。谢谢你的帮助。我确实尝试了'launchPanelRef.Update()'和'.Refresh()' – chow