wxPython: связанные события MenuBar выполняются при инициализации - PullRequest
1 голос
/ 06 марта 2012

Hello StackOverflow Hive Mind;

Я нахожусь в процессе изучения того, как использовать wxPython, который создает GUI для приложения, которое я пишу. Я пробирался через это достаточно хорошо, пока не заметил, что не могу правильно создать строку меню. Все, что я делаю неправильно, заставляет мои привязки событий выполняться при запуске программы. Вот код, о котором идет речь. Незначительные опечатки следует игнорировать, я перепечатываю это с моей машины для разработки, которая находится в автономном режиме, поэтому я могу пропустить ключ здесь или там.

def onDocClick():
   message = wx.MessageBox("did it work?","Question",wx.YES_NO)

def onAboutClick():
   pass

frame = wx.Frame(parent=None,title="RVR GUI",size=(315,490))
frame.Show()
panel = wx.Panel(frame,-1,size=(315,490)

menubar = wx.MenuBar()
fileMenu = wx.Menu()
documentation = fileMenu.Append(wx.ID_NEW,"Documentation")
about = fileMenu.Append(wx.ID_ABOUT,"About")
menuBar.Append(fileMenu,'File')

frame.SetMenuBar(menubar)
menubar.Bind(wx.EVT_MENU,onDocClick(),documentation)
menubar.Bind(wx.EVT_MENU,onAboutClick(),about)

Существует гораздо больше GUI, но остальная часть кода работает нормально, поэтому я не думаю, что вам это нужно. В основном происходит то, что окно сообщения в onDocClick () выполняется, как только я запускаю скрипт, который открывает графический интерфейс. Один раз, когда я нажимаю кнопку amy, остальная часть графического интерфейса инициализируется нормально, а нажатие на пункт меню «Документация» не видит абсолютно ничего. У меня такое чувство, что я, вероятно, упускаю что-то простое, возможно, wx.EVT_MENU не подходит для использования в этой ситуации? Если это так, что будет правильным для использования? Каждый учебник, который я видел на wxPython, делал это без объяснений. Честно говоря, я был потрясен отсутствием значимой документации для wxPython. Учебные пособия по Zetcode и даже всегда полезная мышь против Python, кажется, просто излагают основы работы инструментария. Но я отвлекся, и я справлялся, я просто был озадачен этим. В любом случае спасибо, и я ценю любые отзывы!

Michael

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Вы должны очень внимательно посмотреть на свой код.Я думаю, что вы все делаете правильно с точки зрения использования wxPython, но привязка событий не выполняется должным образом.Вы должны передать имена методов в качестве аргументов для метода Bind.Вместо этого вы делаете вызов метода (это вызывает выполнение связанных методов во время построения пользовательского интерфейса).Чтобы это исправить, вы должны опустить скобки.Последние две строки вашего списка должны выглядеть так:

menubar.Bind(wx.EVT_MENU, onDocClick, documentation)
menubar.Bind(wx.EVT_MENU, onAboutClick, about)

Я опробовал ваш код, и BrtH был прав, яНе удалось выполнить привязку из меню, вместо этого следует связать события из экземпляра wx.Frame.Ваш полный, работающий пример теперь выглядит так:

import wx

def onDocClick(evt):
   message = wx.MessageBox("did it work?","Question",wx.YES_NO)

def onAboutClick(evt):
   print "clicked"

app = wx.App()
frame = wx.Frame(parent=None,title="RVR GUI",size=(315,490))
frame.Show()
panel = wx.Panel(frame,-1,size=(315,490))

menubar = wx.MenuBar()
fileMenu = wx.Menu()
documentation = fileMenu.Append(wx.ID_NEW,"Documentation")
about = fileMenu.Append(wx.ID_ABOUT,"About")
menubar.Append(fileMenu,'File')

frame.SetMenuBar(menubar)
frame.Bind(wx.EVT_MENU,onDocClick,documentation)
frame.Bind(wx.EVT_MENU,onAboutClick,about)
app.MainLoop()
0 голосов
/ 06 марта 2012

Вы привязаны к неправильной вещи.Привязать к раме вместо этого.Попробуйте frame.Bind(wx.EVT_MENU,onDocClick(),documentation)

...