Κλείσιμο εφαρμογής wxPython κρέμεται gui

ψήφοι
0

Έχω αυτή η εφαρμογή η οποία έχει μακρά τρέχει εργασία μέσω ssh, το οποίο παίρνει η stdoutσυνέχεια εκτυπώνει αυτό σε ένα wx.TextCtrl, όλα αυτά δουλεύει μια χαρά. Το πρόβλημα που έχω είναι σε θέση να τερματίσετε την εφαρμογή, επί του παρόντος, όταν κάνω τις gui κολλάει. Η μεγάλη ηλιοθεραπεία έργο ssh θα πρέπει να συνεχίσει να τρέχει στον απομακρυσμένο server και θέλω απλώς να κλείσετε την εφαρμογή. Πώς μπορώ σωστά να σπάσει τη 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()
Δημοσιεύθηκε 10/07/2015 στις 18:32
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
0

Αυτό δημοσιεύτηκε μου με την ομάδα wxPython χρήστες:

Δεν μπορείτε να σπάσει ένα «ενώ True» loop. Θα πρέπει να παρέχει έναν τρόπο για το βρόχο για να βγείτε: ενώ self.LoopContinue: Στη συνέχεια, όταν θέλετε το νήμα για να πεθάνει, μπορείτε να ορίσετε self.sshLog1.LoopContinue σε false.

Ωστόσο, αυτό δεν θα τελειώσει το άλλο νήμα, το οποίο εμποδίζει σε «process.wait_for_result ()». Αν θέλετε ότι για να είναι διακοπτόμενη, θα πρέπει να αλλάξει αυτό σε έναν βρόχο, καθώς και. Ωστόσο, δεδομένου ότι δεν κάνετε τίποτα μετά τις εξόδους της διαδικασίας, γιατί περιμένετε να βγείτε καθόλου; Απλά αναπαράγονται τη διαδικασία και να επιστρέψει αμέσως.

- Tim Roberts, ti ... @ probo.com Providenza & Boekelheide, Inc.

Απαντήθηκε 12/07/2015 στις 12:05
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more