我剛剛開始使用wxPython的,這是我希望做什麼:的wxPython:如何處理事件綁定和show()正確
一)顯示框架(與面板裏面)和該面板上的按鈕。 b)當我按下按鈕時,會彈出一個對話框(我可以從中進行選擇)。 c)當我在對話框中按ok時,對話框應該消失(被破壞),但原始的Frame + Panel +按鈕仍然存在。 d)如果我再次按下該按鈕,對話框將重新出現。
我的代碼如下。 不幸的是,我得到了相反的效果。即,
a)選擇 - 對話框首先顯示(即,由於從不顯示TopLevelframe +按鈕,因此不點擊任何按鈕)。
b)當我在對話框上單擊確定,然後出現帶有按鈕的框架。 c)再次單擊按鈕不起作用(即,對話框不再顯示)。c)再次單擊按鈕不起作用(即,對話框不再顯示)。
我在做什麼錯?似乎只要框架被初始化(即使在調用.Show()之前),對話框也會自動初始化並顯示。
我與Python 2.6
============文件這樣使用Eclipse + Pydev的上的WindowsXP:MainFile.py ============ ===
import wx
import MyDialog #This is implemented in another file: MyDialog.py
class TopLevelFrame(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id,"Test",size=(300,200))
panel=wx.Panel(self)
button=wx.Button(panel, label='Show Dialog', pos=(130,20), size=(60,20))
# Bind EVENTS --> HANDLERS.
button.Bind(wx.EVT_BUTTON, MyDialog.start(self))
# Run the main loop to start program.
if __name__=='__main__':
app=wx.PySimpleApp()
TopLevelFrame(parent=None, id=-1).Show()
app.MainLoop()
============文件:MyDialog.py ===============
import wx
def start(parent):
inputbox = wx.SingleChoiceDialog(None,'Choose Fruit', 'Selection Title',
['apple','banana','orange','papaya'])
if inputbox.ShowModal()==wx.ID_OK:
answer = inputbox.GetStringSelection()
inputbox.Destroy()
Tom,謝謝你的迴應。它可以稍作修改(即,在MyDialog.start中預先啓動(self,evt)...)。雖然我仍然不明白爲什麼這會起作用,爲什麼需要將這個lambda函數加入其中。對我來說似乎是這樣說的:當「按鈕」發出一個EVT_BUTTON事件時,然後執行由lambda定義的函數evt。但是evt只是MyDialog.start(self,evt)的執行[這不是某種遞歸,因爲evt被作爲參數傳遞給自己的定義?]。 – 2010-04-27 19:28:45
我很高興聽到它的工作。我按照你的建議修正了包含MyDialog.start的代碼,並添加了一些評論來幫助澄清。 – tom10 2010-04-27 20:32:12
再次感謝。我想我明白了(儘管我需要把這個理解用更復雜的例子來測試)。感謝你的幫助。 – 2010-04-28 13:04:53