首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wxPython:从其他面板禁用面板

wxPython:从其他面板禁用面板
EN

Stack Overflow用户
提问于 2011-08-20 23:08:06
回答 1查看 1.2K关注 0票数 0

我的应用程序中有多个面板,它们驻留在一个wx.Notebook中。为了便于说明,假设我在一个名为launchTab的文件中有一个名为LaunchPanel的面板,在一个名为scanTab的文件中有一个名为ScanPanel的面板。

我在ScanPanel上有一个按钮,可以锁定图形用户界面一段时间,所以当长时间运行的任务开始时,我现在会禁用面板上的每个小部件。这一切都运行得很好。但我现在想禁用其他面板中的其他东西,如果用户使用鼠标左键触发,可能会发生冲突。我发现可以使用panel.Disable()禁用面板,但我不知道如何从ScanPanel中调用LaunchPanel中面板的Disable

我尝试过从launchTab内部使用import launchTab来访问ScanPanel

代码语言:javascript
复制
import launchTab
...
launchTab.LaunchPanel.Disable()

但是会出现这个错误:TypeError: unbound method Disable() must be called with LaunchPanel instance as first argument (got nothing instead)

我认为答案是一个pubsub,但是我不知道如何设置一个与面板相匹配的pubsub,我只使用它们来更新小部件...?目前有大量的源码,所以我不想全部粘贴,但如果需要的话,我可以提供更多的说明。

帮助?有什么想法?

按以下答案编辑:

所以--我不太确定我是否理解...该应用程序有以下组件。myAppGUI.py:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

我已经尝试了下面的答案,但我认为由于我的初始化使用的是parent=parent (我最初在其他地方使用了示例代码以使其正常工作),我得到了以下错误:

代码语言:javascript
复制
File "gui/scanTab.py", line 223, in __init__
    launchPanel = launchTab.LaunchPanel()
TypeError: __init__() takes exactly 2 arguments (1 given)

当你说放入:

代码语言:javascript
复制
def main():
  scanPanel = ScanPanel()
  launchPanel = LaunchPanel()
  scanPanel.setInstanceLaunchPanel(launchPanel)

这是否包含在scanTab中?在这种情况下,launchPanelRef是否是我想要控制的面板的名称?

对不起--我很容易被弄糊涂。:)

-Chow

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-21 00:08:57

您得到的错误是因为您正在调用一个类的方法,而没有该类的对象的实例。

您需要将LaunchPanel类的实例( LaunchPanel对象)传递给ScanPanel类。

代码语言:javascript
复制
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。

这有什么意义吗?

编辑

我猜您希望能够禁用"scanPanel“中的"launchPanel”,对吧?您需要将setInstanceLaunchPanel添加到“扫描”面板。它所做的一切都允许您存储对启动面板的引用。这意味着在扫描面板中,您将能够控制启动面板实例。

代码语言:javascript
复制
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")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7132596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档