【问题标题】:wxPython: Disable a notebook tab?wxPython:禁用笔记本选项卡?
【发布时间】:2011-08-14 23:12:07
【问题描述】:

是否有禁用笔记本选项卡的方法?就像您可以使用小部件本身一样?我开始了一个漫长的过程,虽然对于那些查看它的人来说应该是不言自明的,但我希望能够防止用户在其他选项卡中乱搞,直到它正在运行的过程完成。

我似乎在 wx.Notebook 中找不到任何可以帮助解决此问题的信息?

代码sn-p:

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")

【问题讨论】:

    标签: python wxpython wxnotebook


    【解决方案1】:

    wx.Notebook 无法做到这一点。但是您可以使用一些更高级的小部件,例如wx.lib.agw.aui.AuiNotebook:

    import wx
    import wx.lib.agw.aui as aui
    
    class MainWindow(wx.Frame):
        def __init__(self, *args, **kwargs):
            wx.Frame.__init__(self, *args, **kwargs)
    
            style = aui.AUI_NB_DEFAULT_STYLE ^ aui.AUI_NB_CLOSE_ON_ACTIVE_TAB
            self.notebook = aui.AuiNotebook(self, agwStyle=style)      
    
            self.panel1 = wx.Panel(self.notebook)
            self.panel2 = wx.Panel(self.notebook)
            self.panel3 = wx.Panel(self.notebook)
    
            self.notebook.AddPage(self.panel1, "First")
            self.notebook.AddPage(self.panel2, "Second")
            self.notebook.AddPage(self.panel3, "Third")
    
            self.notebook.EnableTab(1, False)
    
            self.Show()
    
    
    app = wx.App(False)
    win = MainWindow(None)
    app.MainLoop()
    

    【讨论】:

    • 确实有效,但在风格上,它给我带来了其他问题(aui.AuiNotebook 和 wx.FlatNotebook)。最后坚持使用普通的旧 wx.Notebook。不过还是谢谢。
    【解决方案2】:

    从技术上讲,wx.Notebook 无法禁用选项卡。但是,您可以通过检查单击哪个选项卡来执行相同的操作,如果它被“禁用”,则否决 EVT_NOTEBOOK_PAGE_CHANGING 或 EVT_NOTEBOOK_PAGE_CHANGED 事件。或者,您可以使用上面提到的 AUI 笔记本。请注意,这是来自 agw 库的那个,而不是来自 wx.aui 的那个。 FlatNotebook 还提供禁用选项卡的功能。有关示例,请参见 wxPython 演示。

    【讨论】:

      【解决方案3】:
      class MainFrame(wx.Frame):
          def __init__(self):
              wx.Frame.__init__(self, None)
              p = wx.Panel(self)
              self.nb = wx.Notebook(p)
              ......
      
              self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
      
          def OnPageChanged(self, event):
              if wx.IsBusy():
                  self.Unbind(wx.EVT_NOTEBOOK_PAGE_CHANGED)
                  self.nb.SetSelection(event.GetOldSelection())
                  self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
      

      可以通过 Notebook.SetSelection() 设置活动选项卡。但是事件应该是未绑定/禁用和绑定/启用,以避免无限循环。面板代码中应该有 wx.BeginBusyCursor()、wx.EndBusyCursor()。然后当应用程序繁忙时,选项卡更改被“禁用”。

      【讨论】:

      • 我在 wx.Listbook 上遇到了同样的问题并使用了 aGuegu 答案,但为了避免递归,而不是 SetSelection 和解除绑定和绑定,简单地使用了不会生成页面更改事件的 ChangeSelection。
      猜你喜欢
      • 2018-04-05
      • 2020-11-18
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多