0

我有以下玩具示例代码,其中我在wxPython笔记本中创建了两个选项卡。有一个按钮可以添加新页面,并且在每个页面中我都希望有一个关闭页面的按钮。然而,当点击关闭按钮时,下面的代码没有任何动作。

import wx

class TabPanel(wx.Panel):
    def __init__(self, parent, pageNum):
        self.parent = parent
        self.pageNum = pageNum
        wx.Panel.__init__(self, parent=parent)

        btn = wx.Button(self, label="Close Page " + str(pageNum))
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(btn, 0, wx.ALL, 10)
        self.SetSizer(sizer)

        btn.Bind(wx.EVT_BUTTON, self.closeTab)

    def closeTab(self,event):
        self.Close()

class DemoFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Notebook", size=(600,400))
        panel = wx.Panel(self)
        self.tab_num = 2

        self.notebook = wx.Notebook(panel)
        tabOne = TabPanel(self.notebook, 1)
        self.notebook.AddPage(tabOne, "Page 1")

        tabTwo = TabPanel(self.notebook, 2)
        self.notebook.AddPage(tabTwo, "Page 2")

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.notebook, 1, wx.ALL|wx.EXPAND, 5)

        btn = wx.Button(panel, label="Add Page")
        btn.Bind(wx.EVT_BUTTON, self.addPage)
        sizer.Add(btn)

        panel.SetSizer(sizer)
        self.Layout()
        self.Show()

    def addPage(self, event):
        self.tab_num += 1
        new_tab = TabPanel(self.notebook, self.tab_num)
        self.notebook.AddPage(new_tab, "Page %s" % self.tab_num)

if __name__ == "__main__":
    app = wx.App(False)
    frame = DemoFrame()
    app.MainLoop()

该代码产生以下窗口:

笔记本程序

问题

关闭按钮不执行任何操作。

问题

我应该如何更改我的代码才能让关闭按钮关闭它所在的相应页面?

4

2 回答 2

2

如果您GetSelection()使用wx.Notebook. 该方法返回当前选定页面的索引。在此之后,您可以直接删除选定的页面。

带注释的代码(####):

import wx

class TabPanel(wx.Panel):
    def __init__(self, parent, pageNum):
        self.parent = parent
        self.pageNum = pageNum
        wx.Panel.__init__(self, parent=parent)

        btn = wx.Button(self, label="Close Page " + str(pageNum))
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(btn, 0, wx.ALL, 10)
        self.SetSizer(sizer)

        btn.Bind(wx.EVT_BUTTON, self.closeTab)

    def closeTab(self,event):
        #### Just one line and no extra variable to remove the selected page
        self.parent.RemovePage(self.parent.GetSelection())

class DemoFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Notebook", size=(600,400))
        panel = wx.Panel(self)
        self.tab_num = 2

        self.notebook = wx.Notebook(panel)
        tabOne = TabPanel(self.notebook, 1)
        self.notebook.AddPage(tabOne, "Page 1")

        tabTwo = TabPanel(self.notebook, 2)
        self.notebook.AddPage(tabTwo, "Page 2")

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.notebook, 1, wx.ALL|wx.EXPAND, 5)

        btn = wx.Button(panel, label="Add Page")
        btn.Bind(wx.EVT_BUTTON, self.addPage)
        sizer.Add(btn)

        panel.SetSizer(sizer)
        self.Layout()
        self.Show()

    def addPage(self, event):
        self.tab_num += 1
        new_tab = TabPanel(self.notebook, self.tab_num)
        self.notebook.AddPage(new_tab, "Page %s" % self.tab_num)

if __name__ == "__main__":
    app = wx.App(False)
    frame = DemoFrame()
    app.MainLoop()
于 2019-06-26T19:45:09.773 回答
0

不确定是否有更好的解决方案,但添加一个全局变量tabs,它是一个包含实际选项卡的列表,并且对closeTab函数进行一些更改即可完成工作。

关闭选项卡的方法是使用对象RemovePage内的Notebook函数。

import wx
tabs = [1,2]

class TabPanel(wx.Panel):
    def __init__(self, parent, pageNum):
        self.parent = parent
        self.pageNum = pageNum
        wx.Panel.__init__(self, parent=parent)

        btn = wx.Button(self, label="Close Page " + str(pageNum))
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(btn, 0, wx.ALL, 10)
        self.SetSizer(sizer)

        btn.Bind(wx.EVT_BUTTON, self.closeTab)

    def closeTab(self,event):
        notebook = self.parent
        notebook.RemovePage(tabs.index(self.pageNum))
        tabs.remove(self.pageNum)

class DemoFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Notebook", size=(600,400))
        panel = wx.Panel(self)
        self.tab_num = len(tabs)

        self.notebook = wx.Notebook(panel)
        tabOne = TabPanel(self.notebook, 1)
        self.notebook.AddPage(tabOne, "Page 1")

        tabTwo = TabPanel(self.notebook, 2)
        self.notebook.AddPage(tabTwo, "Page 2")

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.notebook, 1, wx.ALL|wx.EXPAND, 5)

        btn = wx.Button(panel, label="Add Page")
        btn.Bind(wx.EVT_BUTTON, self.addPage)
        sizer.Add(btn)

        panel.SetSizer(sizer)
        self.Layout()
        self.Show()

    def addPage(self, event):
        self.tab_num += 1
        new_tab = TabPanel(self.notebook, self.tab_num)
        self.notebook.AddPage(new_tab, "Page %s" % self.tab_num)
        tabs.append(self.tab_num)
        print tabs

if __name__ == "__main__":
    app = wx.App(False)
    frame = DemoFrame()
    app.MainLoop()
于 2019-06-26T19:31:14.447 回答