2015-07-10 84 views
0

我通过ssh有一个长时间运行任务的应用程序,它获取stdout然后打印到wx.TextCtrl,这一切工作正常。我现在的问题是能够退出应用程序,目前当我执行gui挂起时。长时间的sunning ssh任务应该继续在远程服务器上运行,我只想关闭应用程序。如何正确地打破while True循环以及按下退出按钮时的ssh任务?关闭wxpython应用程序挂起gui

import wx 
import wx.stc as stc 
from subprocess import Popen, PIPE, STDOUT 
import sys 
import spur 
import threading 
import select 
import codecs 
import os 
import time 
import io 

class MainWindow(wx.Frame): 
    def __init__(self, parent, id, title): 
     wx.Frame.__init__(self, parent, id, title, size=(600, 500), style=wx.DEFAULT_FRAME_STYLE & ~ (wx.RESIZE_BORDER | 
               wx.RESIZE_BOX | 
               wx.MAXIMIZE_BOX)) 

     self.running_log = wx.TextCtrl(self, pos=(5, 5), size=(570,390)) 

     self.buttonGo = wx.Button(self, -1, "Go", pos=(180,420)) 
     self.buttonGo.Bind(wx.EVT_BUTTON, self.Go) 
     self.buttonClose = wx.Button(self, -1, "Quit", pos=(285,420)) 
     self.buttonClose.Bind(wx.EVT_BUTTON, self.OnClose) 
     self.Show() 

     self.CreateStatusBar() 
     menuBar = wx.MenuBar() 
     menu = wx.Menu() 
     self.SetMenuBar(menuBar) 
     self.sshLog1 = sshLog(self) 
     self.Centre() 
     self.Show() 

    def Go(self, event): 
     threading.Thread(target=self.sshLog1.runCommand).start()   
     threading.Thread(target=self.sshLog1.readlog1).start() 

    def OnClose(self, e): 
     sys.exit() 
     CloseApp() 

class sshLog(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     self.parent = parent 
     self.frame = self 

    def runCommand(self): 
     self.output_file = io.BytesIO() 
     shell = spur.SshShell(hostname='10.0.1.1', username='remoteUsername', password='remotePassword', missing_host_key=spur.ssh.MissingHostKey.accept) 
     process = shell.spawn(['ping', 'google.com', '-t'], stdout=self.output_file) 
     process.wait_for_result() 

    def readlog1(self): 
     while True: 
      time.sleep(1) 
      wx.CallAfter(self.readlog2) 

    def readlog2(self): 
     last_line = str(self.output_file.getvalue()) 
     wx.CallAfter(self.parent.running_log.AppendText, last_line) 

############################### 
########## CLOSE APP ########## 
############################### 
class CloseApp(wx.Frame): 
    def __init__(e): 
     sys.exit(0) 

app = wx.App() 
MainWindow(None, -1, 'My App') 
app.MainLoop() 

回答

0

这被张贴到我的wxPython的用户群:

你不能打破“而真正的”循环。您必须提供循环退出的方式: while self.LoopContinue: 然后,当您希望线程死掉时,将self.sshLog1.LoopContinue设置为false。

但是,这不会结束在“process.wait_for_result()”中阻塞的另一个线程。如果你想让它变成可中断的,你也必须把它变成一个循环。但是,由于流程退出后您没有做任何事情,您为何等待它退出?只需生成过程并立即返回。

- 蒂姆·罗伯茨,TI ... @ probo.com Providenza & BOEKELHEIDE公司