wxPython: отключить панель из другой панели - PullRequest
0 голосов
/ 20 августа 2011

В моем приложении несколько панелей, которые находятся в 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

1 Ответ

2 голосов
/ 20 августа 2011

Ошибка, которую вы получаете, заключается в том, что вы вызываете метод класса без экземпляра объекта этого класса.

Вам необходимо передать экземпляр вашего класса 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, который можно вызвать отключить.

Имеет ли это смысл? РЕДАКТИРОВАТЬ

Я предполагаю, что вы хотите иметь возможность отключить "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")
...