2014-10-09 66 views
2

我有一個框架,一旦用戶點擊退出按鈕,我想要一個對話框打開並詢問他是否真的想關閉窗口。如何在wxPython中引發wx.EVT_CLOSE之後停止關閉窗口?

所以我做:

self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) 

,然後我有回調:

def OnCloseWindow(self, event): 
    dialog = wx.MessageDialog(self, message = "Are you sure you want to quit?", caption = "Caption", style = wx.YES_NO, pos = wx.DefaultPosition) 
    response = dialog.ShowModal() 

    if (response == wx.ID_YES): 
     Pairs = [] 
     self.list_ctrl_1.DeleteAllItems() 
     self.index = 0 
     self.Destroy() 
    elif (response == wx.ID_NO): 
     wx.CloseEvent.Veto(True) 
    event.Skip() 

這工作,但我得到的錯誤:

TypeError: unbound method Veto() must be called with CloseEvent instance as first argument (got bool instance instead) 

如何趕上引發事件的closeWindows實例?

+0

嗯,在我的代碼中,似乎我甚至不需要它。如果我捕獲該事件並且不顯式調用'self.Destroy()',則該窗口不會關閉。我也不會調用'event.Skip()'。我或者自己關閉窗戶。就是這樣。 – Fenikso 2014-10-10 15:06:08

+0

你可以發佈你的代碼嗎?不太明白你做了什麼! – 2014-10-10 16:46:36

回答

2

你並不需要那麼做。如果您發現該事件並且不要撥打event.Skip(),它不會向前傳播。因此,如果您趕上活動並且不要撥打event.Skip()self.Destroy(),窗口會保持打開狀態。

import wx 

class MainWindow(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     wx.Frame.__init__(self, *args, **kwargs) 
     self.panel = wx.Panel(self) 
     self.Bind(wx.EVT_CLOSE, self.on_close) 
     self.Show() 

    def on_close(self, event): 
     dialog = wx.MessageDialog(self, "Are you sure you want to quit?", "Caption", wx.YES_NO) 
     response = dialog.ShowModal() 
     if response == wx.ID_YES: 
      self.Destroy() 

app = wx.App(False) 
win = MainWindow(None) 
app.MainLoop() 
+0

甜,謝謝!工作得更好! – 2014-10-10 17:58:05

+0

@ G-XP-MIA請注意[文檔](http://www.wxpython.org/docs/api/wx.CloseEvent-class.html)建議您*如果不'請*調用'Veto'摧毀窗口:*「如果你沒有銷燬窗口,你應該調用'Veto'來讓調用代碼知道你沒有銷燬窗口,這允許'wx.Window.Close'函數返回True或者根據關閉指示是否兌現而錯誤。「* – dano 2014-10-10 22:42:56

+0

@dano有趣。我從來沒有真正閱讀關閉事件的文檔。 – Fenikso 2014-10-11 20:30:07

2

您想致電event.Veto(True),而不是wx.CloseEvent.Veto(True)eventwx.CloseEvent的一個實例 - 這就是你想要的Veto。現在你試圖在wx.CloseEvent類本身上撥打Veto,這是沒有意義的。

+0

調用event.Veto(True)不起作用。剛剛測試過。當我編碼並運行代碼時,當我點擊對話框上的「否」時,它會關閉。我這樣做的方式工作,但提出了一個錯誤。但你錯誤地給了我答案,事件就是「事件」。所以我必須調用的是wx.CloseEvent.Veto(event,True) - 並且完美地工作。 – 2014-10-10 12:16:20

+0

這很奇怪,因爲'event.Veto(True)'和'wx.CloseEvent(event,True)'是等價的。如果一個人工作,另一個人也應該工作。無論如何,很高興你的工作... – dano 2014-10-10 12:31:52

相關問題