В моем приложении несколько панелей, которые находятся в wx.Notebook
. Для иллюстрации, давайте предположим, что у меня есть панель с именем LaunchPanel
в файле с именем launchTab
и панель с именем ScanPanel
в файле с именем scanTab
.
У меня есть кнопка на ScanPanel
, которая может заблокировать графический интерфейс на некоторое время, поэтому в настоящее время я отключаю каждый виджет на самой панели, когда запускается долгосрочное задание. Это все отлично работает. Но теперь я хочу отключить другие функции в других панелях, которые могут конфликтовать, если пользователь запускает триггер, довольный левой кнопкой мыши. Я обнаружил, что вы можете отключить панель с помощью 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, но я не знаю, как настроить его для отображения на панели, я только использовал их для обновления виджета ...? На данный момент огромное количество исходного кода, поэтому я не хочу вставлять все это, но могу дать больше разъяснений, если это необходимо.
Помощь? Мысли?
РЕДАКТИРОВАТЬ НИЖЕ ОТВЕТА:
Итак - я не совсем уверен, что понимаю ... в приложении есть следующие компоненты. 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")
Это основной файл, который запускает все остальные мои вкладки в блокноте. Тогда у меня запускаем Tab:
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