2013-03-13 6 views
1

Я пытаюсь запустить событие, когда пользователь выбирает или изменяет вкладку на ноутбуке. Вот код, который у меня есть. В классе PageOne я попытался связать wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED с функцией ChangingTest (self, evt). Кажется, что независимо от того, какое событие я пытаюсь использовать при привязке, я не могу запустить событие. Это возможно? Что мне не хватает?Нет события при выборе вкладки в записной книжке в wxPython

У меня нет проблем с нажатием кнопки и вызовом self.ChangingTest, но я хочу щелкнуть по вкладке, чтобы позвонить self.ChangingTest.

import wx 
import wx.lib.inspection 

class PageOne(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     box = wx.BoxSizer(wx.VERTICAL) 
     # Want the users' click on the panel tab to fire an event and 
     # call ChangingTest 
     self.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.ChangingTest) 

     cmdClick = wx.Button(self, wx.ID_CLOSE, "Click Me") 
     cmdClick.Bind(wx.EVT_BUTTON, self.ChangingTest) 
     box.Add(cmdClick, 0, wx.ALL, 10) 


    def ChangingTest(self, evt): 
     print "ChangingTest2" 


class PageTwo(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     t = wx.StaticText(self, -1, "This is a PageTwo object", (40,40)) 

class PageThree(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     t = wx.StaticText(self, -1, "This is a PageThree object", (60,60)) 


class MainFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, title="Simple Notebook Example") 

     # Here we create a panel and a notebook on the panel 
     p = wx.Panel(self) 
     nb = wx.Notebook(p) 

     # create the page windows as children of the notebook 
     page1 = PageOne(nb) 
     page2 = PageTwo(nb) 
     page3 = PageThree(nb) 

     # add the pages to the notebook with the label to show on the tab 
     nb.AddPage(page1, "Page 1") 
     nb.AddPage(page2, "Page 2") 
     nb.AddPage(page3, "Page 3") 

     # finally, put the notebook in a sizer for the panel to manage 
     # the layout 
     sizer = wx.BoxSizer() 
     sizer.Add(nb, 1, wx.EXPAND) 
     p.SetSizer(sizer) 



if __name__ == "__main__": 
    app = wx.App() 
    MainFrame().Show() 
    app.MainLoop() 

У меня есть рабочая версия здесь:

import wx 

class PageOne(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     t = wx.StaticText(self, -1, "This is a PageOne object", (20,20)) 

class PageTwo(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     t = wx.StaticText(self, -1, "This is a PageTwo object", (40,40)) 

class PageThree(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     t = wx.StaticText(self, -1, "This is a PageThree object", (60,60)) 


class MainFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, title="Simple Notebook Example") 

     # Here we create a panel and a notebook on the panel 
     p = wx.Panel(self) 
     nb = wx.Notebook(p) 

     # create the page windows as children of the notebook 
     page1 = PageOne(nb) 
     page2 = PageTwo(nb) 
     page3 = PageThree(nb) 

     # add the pages to the notebook with the label to show on the tab 
     nb.AddPage(page1, "Page 1") 
     nb.AddPage(page2, "Page 2") 
     nb.AddPage(page3, "Page 3") 

     # finally, put the notebook in a sizer for the panel to manage 
     # the layout 
     sizer = wx.BoxSizer() 
     sizer.Add(nb, 1, wx.EXPAND) 
     p.SetSizer(sizer) 

    # bind event to notebook 
     nb.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.ChangingTest) 

    def ChangingTest(self, evt): 
     print "It worked!" 


if __name__ == "__main__": 
    app = wx.App() 
    MainFrame().Show() 
    app.MainLoop() 

ответ

3

Используйте wx.EVT_NOTEBOOK_PAGE_CHANGED вместо wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED, потому что вы используете wx.Notebook, не wx.aui.AuiNotebook. Кроме того, вы должны привязать не к классу PageOne, а к объекту ноутбука. Таким образом, вы могли бы написать parent.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.ChangingTest) или вы могли бы связать его за пределами класса PageOne (nb.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, ...)).

+0

Спасибо за информацию. Я привязывал событие к неправильному объекту. Как только я выполнил «привязку» к ноутбуку, а не PageOne, он работал нормально. В очередной раз благодарим за помощь. –

+0

Вот рабочая версия кода. класс MainFrame (wx.Frame): Защиту __init __ (Я): wx.Frame .__ INIT __ (самость, None, название = "Simple Notebook Пример") # Здесь мы создаем панель и ноутбук на панели р = wx.Panel (само) нб = wx.Notebook (р) # создавать окна страницы как дети ноутбука стр.1 = PageOne (нб) ... # связывают события в блокнот nb.Bind (wx.EVT_NOTEBOOK_PAGE_CHANGED, self.ChangingTest) def ChangingTest (self, evt): print «Это сработало!» –