2010-05-18 35 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 
相关问题