Как генерировать новые страницы на ноутбуке wxPython с помощью кнопок закрытия? - PullRequest
0 голосов
/ 26 июня 2019

У меня есть следующий код примера игрушки, в котором я создаю две вкладки в блокноте 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()

Этот код выдает ниже окна:

Notebook program

Задача

Кнопки закрытия не выполняют никаких действий.

Вопрос

Как мне изменить свой код, чтобы кнопка закрытия закрывала соответствующую страницу, где он находится?

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Это может быть проще, если вы используете 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()
0 голосов
/ 26 июня 2019

Не уверен, что может быть лучшее решение, но добавление глобальной переменной 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()
...