2011-08-20 22 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