2010-05-18 33 views
1

據我所知,我的問題源於使用wxApp。wxPython:MainLoop()似乎掛起

在一個litte子例程中,我調用一個wx.MessageDialog來請求yes或no。我根據需要檢索某個過程的答案。 下面其實我的示例代碼工作(儘管它可能是醜陋的),除了對話框保持擊中其中一個按鈕後打開...

import wx 
from os import path 
def HasFile(filename): 
    if path.isfile(filename): 
     app = wx.App() 
     dial = wx.MessageDialog(None, 
           'Die Datei "'+filename+'" wurde gefunden.\nSoll sie eingelesen werden?', 
           'Bitte antworten', 
           wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION) 
     result = dial.ShowModal() 
     dial.EndModal(retCode=0) 
     dial.Destroy() 
     app.MainLoop() 
     return result == wx.ID_YES 
    else: 
     return False 

因此,儘管該計劃的其餘部分也無論是預期,盒子就坐在那裏。 這也似乎是我後來對matplotlib的調用正在產生錯誤(Tkinter錯誤是準確的),也許是因爲wx的東西?

編輯:我試圖通過調用app.Destroy()來結束應用程序。這並沒有改變箱子仍然存在的事實。當我發出一個app.IsActive()後,整個程序退出(幾乎就像一個sys.exit())!怎麼來的?

編輯2:像這樣添加一個wxApp不是一個好主意,因爲其他腳本也會受到影響。後續的繪圖命令不會顯示,我不知道如何解決這個問題。因此我決定全部刪除DialogBox。

回答

2

用EndModal調用你的函數,它工作正常,並在選擇yes/no後返回到控制檯。選擇其中的一個基本要求EndModal,並手動調用這是拋出一個異常

Traceback (most recent call last): 
    File "blah.py", line 19, in <module> 
    HasFile("C:\tbzrcommand_args.txt") 
    File "blah.py", line 12, in HasFile 
    dial.EndModal(retCode=0) 
    File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_windows.py", line 715, in EndModal 
    return _windows_.Dialog_EndModal(*args, **kwargs) 
wx._core.PyAssertionError: C++ assertion "IsModal()" failed at ..\..\src\msw\dialog.cpp(361) in wxDialog::EndModal(): EndModal() called for non modal dialog 

修復:

import wx 
from os import path 
def HasFile(filename): 
    if path.isfile(filename): 
     print 'gfd' 
     app = wx.App(redirect=False) 
     dial = wx.MessageDialog(None, 
           'Die Datei "'+filename+'" wurde gefunden.\nSoll sie eingelesen werden?', 
           'Bitte antworten', 
           wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION) 
     result = dial.ShowModal() 
     dial.Destroy() 
     app.MainLoop() 
     return result == wx.ID_YES 
    else: 
     return False 
相關問題