关闭wxpython应用程序挂起gui



如果这个应用程序通过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()

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

你不能打破" while True "循环。你必须提供一种方式让循环退出:而自我。LoopContinue:然后,当您希望线程死亡时,可以设置self.sshLog1。

然而,这不会结束另一个线程,它阻塞在" process.wait_for_result() "中。如果你想让它是可中断的,你也必须把它变成一个循环。但是,由于在进程退出后实际上不做任何事情,为什么要等待它退出呢?只需生成进程并立即返回。

- - -蒂姆·罗伯茨ti...@probo.comProvidenza,Boekelheide, Inc .

相关内容

  • 没有找到相关文章

最新更新