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()