2014-02-11 26 views
0

我使用...甲爲了等待一個外部信號(例如用「wx.MessageDialog」

waitingdlg = wx.MessageDialog(self, 'Waiting for soundcard signal...', 'Test', wx.CANCEL) 
waitingdlg.ShowModal() 

while inputvolume < 10:  # inputvolume is a global variable 
           # modified by another thread linked to soundcard input 
    wx.MilliSleep(10) 

waitingdlg.Destroy() 

...等待對話框:聲卡的輸入電平是高到一定分貝水平)。

我希望wx.MessageDialog在觸發發生時自動關閉(當inputvolume變爲>= 10時)。

但由於waitingdlg.ShowModal()while從來沒有發生! 另一方面,如果沒有ShowModal,則不顯示對話框。

如何使這個wx.MessageDialog等待外部觸發器自動關閉?

回答

3

您可以創建另一個線程來檢查音量。 請使用wx.Dialog,因爲wx.MessageDialog不是真正的wx.Dialog,它不響應Destroy()。

import wx 
    import threading 

    def timer_start(dlg): 
     t = threading.Timer(0,test_func,(dlg,)) 
     t.start() 

    def test_func(dlg): 

     global inputvolume 
     print "inputvolume: ", inputvolume 

     if inputvolume < 100: 
      wx.MilliSleep(10) 
      timer_start(dlg) 
      inputvolume += 1 
     else: 
      #dlg.EndModal(wx.CANCEL) 
      dlg.Destroy() 


    if __name__ == "__main__": 
     inputvolume = 0 
     app = wx.App(False) 
     fame = wx.Frame(None) 
     fame.Show() 

     waitingdlg = wx.Dialog(fame,title = 'Test') 
     timer_start(waitingdlg) 
     waitingdlg.ShowModal() 

     app.MainLoop() 
+0

非常感謝! 'wx.MessageDialog'對'Destroy()'沒有反應(順便說一下,爲什麼會這樣?)這樣的恥辱。由於'wx.MessageBox'已準備好可以使用,所以必須自己重新設計整個消息框(帶有文本框,按鈕,'Bind()'等),這真是一種恥辱! – Basj

+0

如果您不想重新設計所有內容,請使用GenericMessageBox –

+0

@Basj請檢查此[鏈接](http://wxpython-users.1045709.n5.nabble.com/Destroy-a-wx-MessageDialog-after-a -given-量之時間td2852005.html)。據說「wx.MessageDialog不是一個真正的wx.Dialog,它只是一個方便的原生API函數 ,因此它並不實現 的大部分wx.Dialog API」。 –