2014-11-13 2 views
0

Это продолжение моего предыдущего вопроса, wxPython popup from calling imported function.Выход из потока вызывает неуверенный GUI

Мне удалось выяснить, как создать диалоговое окно wxPython, чтобы определить, должен ли поток, который мой GUI-вызов должен продолжить, выполнить. Я просто создал диалоговое окно в самом потоке. Однако, как только я сделал выход потока, нажав «нет» в этом всплывающем окне, кнопка закрытия в моем графическом интерфейсе перестала отвечать на запросы, и я не смог закрыть сам графический интерфейс. Еще раз, ваша помощь очень ценится!

код GUI:

import sys 
import os 
import re 
import subprocess 
import threading 
import wx 
import errno, os, stat, shutil 
import extern_func 

#this object redirects the external function output to the text box 
class RedirectText(object): 
    def __init__(self,aWxTextCtrl): 
     self.out=aWxTextCtrl 

    def write(self,string): 
     self.out.WriteText(string) 

#GUI code here 
class progFrame(wx.Frame): 
    def __init__(self, parent): 
     wx.Frame.__init__(self, parent, title="functionGUI", size=(800, 600), style=wx.DEFAULT_FRAME_STYLE^wx.RESIZE_BORDER) 
     panel = wx.Panel(self) 

     #more things.... 

     self.closeButton = wx.Button(panel, wx.ID_OK, "Run", pos=(250, 300)) 
     self.runButton = wx.Button(panel, wx.ID_OK, "Run", pos=(200, 300)) 

     self.out=wx.TextCtrl(panel, style=wx.TE_MULTILINE|wx.VSCROLL|wx.TE_READONLY, pos = (300, 50), size=(500, 200)) 

     #Run button event 
     self.Bind(wx.EVT_BUTTON, self.OnRun, self.runButton) 

     #close button event 
     self.Bind(wx.EVT_BUTTON, self.OnClose, self.closeButton) 

     #command prompt output to frame 
     redir=RedirectText(self.out) 
     sys.stdout=redir 
     self.Show() 

    def OnRun(self, event): 
     t=threading.Thread(target=self.__run) 
     t.start() 

    def OnClose(self, event): 
     self.Destroy() 

    #external function call 
    def __run(self): 
     externFunc() 

if __name__ == '__main__': 
app = wx.App(False) 
progFrame(None) 
app.MainLoop() 

Внешний код функции:

import sys 

def externFunc(): 
    print "Starting execution..." 
    #a bunch of code... 

    #this is the code for the Yes/No prompt and what introduced the buggy behavior 
    if(os.path.isdir(mirror_source_path) or os.path.isdir(mirror_dest_path)): 
     app = wx.App(False) 
     dlg = wx.MessageDialog(None, "Something bad happened. Continue?","Warning",wx.YES_NO | wx.ICON_QUESTION) 
     retCode = dlg.ShowModal() 
     if (retCode == wx.ID_YES): 
      print "Continuing." 
     else: 
      print "Aborted." 
      return None 
      sys.exit(0) 
     dlg.Destroy() 


    #more function code... 
    print "Success!" 

ответ

0

Вы не можете иметь 2 WxPython основные контуры, работающие одновременно. Это вызовет довольно странное поведение. Лично я думаю, что я разделил бы этот код на 2 потока. Когда первый заканчивается, он отправляет сообщение с использованием wx.CallAfter и pubsub или wx.PostEvent, и в это время вы можете выполнить оператор if в обработчике wxPython.

Если вы продолжаете, то вы разворачиваете вторую нить с остальной частью кода функции.

Смежные вопросы