Закрытие приложения wxpython вешает графический интерфейс

Я это приложение, которое имеет долгую задачу через SSH, который получает stdout затем печатает это wx.TextCtrlвсе это прекрасно работает. Проблема в том, что я могу выйти из приложения, в настоящее время, когда я делаю зависание графического интерфейса. Долгая солнечная задача ssh должна продолжаться на удаленном сервере, и я просто хочу закрыть приложение. Как я могу правильно сломать while True цикл, а также задача ssh при нажатии кнопки Quit?

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 ответ

Решение

Это было опубликовано для меня в группе пользователей wxPython:

Вы не можете разорвать цикл "пока верно". Вы должны предоставить способ выхода из цикла: while self.LoopContinue: Затем, когда вы хотите, чтобы поток умер, вы устанавливаете self.sshLog1.LoopContinue в false.

Однако это не приведет к завершению другого потока, который блокируется в "process.wait_for_result()". Если вы хотите, чтобы это было прерываемым, вам также придется изменить это в цикл. Однако, поскольку вы действительно ничего не делаете после завершения процесса, почему вы вообще ждете его завершения? Просто возродите процесс и немедленно вернитесь.

- Тим Робертс, ti...@probo.com Providenza & Boekelheide, Inc.

Другие вопросы по тегам