关闭wxpython应用程序会挂起gui

时间:2015-07-10 19:32:12

标签: python ssh while-loop quit wx.textctrl

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

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

1 个答案:

答案 0 :(得分:0)

这是在wxPython-users组中发布给我的:

你无法打破“while True”循环。您必须提供循环退出的方法:         而self.LoopContinue: 然后,当你想让线程死掉时,你将self.sshLog1.LoopContinue设置为false。

但是,这不会结束另一个在“process.wait_for_result()”中阻塞的线程。如果您希望它是可中断的,您也必须将其更改为循环。但是,由于您在进程退出后没有真正做任何事情,为什么还要等它退出呢?只是产生过程并立即返回。

- 蒂姆罗伯茨,蒂... @ probo.com Providenza& Boekelheide,Inc。