wxPython:如何禁用标签页?

5 投票
3 回答
4596 浏览
提问于 2025-04-16 23:35

有没有办法禁用一个笔记本标签?就像你可以对小部件做的那样?我有一个很长的处理过程要启动,虽然对于查看它的人来说应该是比较简单明了的,但我想在这个过程完成之前,防止用户在其他标签里乱动。

我在 wx.Notebook 中似乎找不到任何可以帮助我的东西?

代码片段:

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

3 个回答

0
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()。这样,当应用程序忙碌时,标签页的切换就会被“禁用”。

2

从技术上讲,wx.Notebook没有直接禁用标签页的方法。不过,你可以通过检查用户点击的是哪个标签页来实现类似的效果。如果点击的是“禁用”的标签页,就可以阻止EVT_NOTEBOOK_PAGE_CHANGING或EVT_NOTEBOOK_PAGE_CHANGED事件的发生。或者,你也可以使用上面提到的AUI笔记本。需要注意的是,这个是来自agw库的,而不是wx.aui的那个。FlatNotebook也提供了禁用标签页的功能。可以查看wxPython的演示来获取示例。

3

这件事用 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()

撰写回答