Führen Sie den Prozess mit der Echtzeit-Ausgabe zu einer Tkinter-GUI aus

Ich habe versucht, eine GUI in Tkinter Python zu erstellen. Ich möchte die Ausgabe eines Tools an meine Tkinter-Schnittstelle anzeigen. Das Tool funktioniert super in Kommandozeile, aber es ist ein kontinuierlicher Scanner. Etwas wie ein kontinuierliches Ping (ich meine mit Ping-Befehl in Linux ohne Optionen).

Jetzt ist das Problem, da die Ausgabe von Ping nie vollständig ist, daher kann ich die Ausgabe in Tkinter nicht drucken. Es macht auch meine Anwendung einfrieren. Ich kann den Befehl auch nach wenigen Sekunden nicht stoppen, um die Ausgabe anzuzeigen. Führen Sie Prozess mit Echtzeit-Ausgabe in PHP Ich fand diese oben Link hilfreich für PHP, aber wie kann ich konvertieren diesen Code in Python:

  • CERTIFICATE_VERIFY_FAILED bei der Verwendung von urllib, um eine Verbindung zu almerys.com herzustellen
  • Überwachen Sie die Mauskoordinaten in Echtzeit in Linux
  • Howe TensorArray und while_loop arbeiten zusammen im Tensorflow?
  • Wie man Daemon-Prozess von Python auf Windows starten?
  • Wie man einen anderen Prozess hervorbringt und die Ausgabe in Python aufnimmt?
  • Konfigurieren, damit die Pip-Installation von github arbeiten kann
  • Https://stackoverflow.com/a/6144213/4931414

    Hier ist ein Beispielcode, den ich auf tkinter Frame anzeigen möchte

    #!/usr.... import subprocess x = subprocess.call(["ping", "127.0.0.1"]) print x 

    Das funktioniert super auf Kommandozeile, aber ich bin nicht immer Ausgabe auf tkinter Schnittstelle.

  • Python-Objekt zu nativem c ++ - Zeiger
  • ImportError auf der Konsole aber nicht in PyCharm
  • Wie kann ich an 3 Tafeln teilnehmen und alle drei zusammenstellen, die sich in web2py angeschlossen haben?
  • MatPlotLib teilen sich über die ganze Figur
  • PyAudio Eingang überlaufen
  • Python regulärer Ausdruck ersetzt einen Teil einer übereinstimmenden Zeichenfolge
  • 2 Solutions collect form web for “Führen Sie den Prozess mit der Echtzeit-Ausgabe zu einer Tkinter-GUI aus”

    Wenn du deinen Code zum folgenden wechsest, wirst du sehen, dass Ping, und nicht das "print x" ist was auf der Konsole angezeigt wird

     import subprocess x = subprocess.call(["ping", "127.0.0.1"]) print "x is", x ## or comment out this line 

    Sie müssten Pipes und Flush Stdout in regelmäßigen Abständen zu bekommen, was ich denke, Sie wollen. Siehe popen bei Doug Hellmanns Python-Modul der Woche http://pymotw.com/2/subprocess/index.html#module-subprocess

    Zuerst muss ich zugeben, dass ich nicht so vertraut bin mit dem Modul subprocess und threading , aber ich habe versucht, eine einfache Konsole zu erstellen, die Sie akzeptiert, um einen Befehl zu schreiben, dessen Ausgabe in einem Text Widget angezeigt wird.

    Die Grundidee besteht darin, einen neuen, parallel laufenden Thread zu haben , der einen Befehl verarbeitet, wenn du auf die Schaltfläche Execute . Wir halten iteration durch die Linien von stdout und stecken sie in das Text-Widget ein.

    Es scheint, für jeden Befehl zu arbeiten, aber ich bin ziemlich sicher, dass es einige Probleme und Fehler gibt. Wenn Sie sich mit den Modulen vertraut machen, die ich oben angeführt habe, sehen Sie ein ernstes Problem mit meinem Code, oder haben Sie Vorschläge, um es zu verbessern, würde ich auf jeden Fall auf Sie hören, um dieses Beispiel zu verbessern.

    Jetzt ist das der Code:

     import tkinter as tk from tkinter.scrolledtext import ScrolledText import threading from subprocess import Popen, PIPE class Console(tk.Frame): """Simple console that can execute bash commands""" def __init__(self, master, *args, **kwargs): tk.Frame.__init__(self, master, *args, **kwargs) self.text_options = {"state": "disabled", "bg": "black", "fg": "#08c614", "insertbackground": "#08c614", "selectbackground": "#f01c1c"} self.text = ScrolledText(self, **self.text_options) # It seems not to work when Text is disabled... # self.text.bind("<<Modified>>", lambda: self.text.frame.see(tk.END)) self.text.pack(expand=True, fill="both") # bash command, for example 'ping localhost' or 'pwd' # that will be executed when "Execute" is pressed self.command = "" self.popen = None # will hold a reference to a Popen object self.running = False # True if the process is running self.bottom = tk.Frame(self) self.prompt = tk.Label(self.bottom, text="Enter the command: ") self.prompt.pack(side="left", fill="x") self.entry = tk.Entry(self.bottom) self.entry.bind("<Return>", self.start_thread) self.entry.bind("<Command-a>", lambda e: self.entry.select_range(0, "end")) self.entry.bind("<Command-c>", self.clear) self.entry.focus() self.entry.pack(side="left", fill="x", expand=True) self.executer = tk.Button(self.bottom, text="Execute", command=self.start_thread) self.executer.pack(side="left", padx=5, pady=2) self.clearer = tk.Button(self.bottom, text="Clear", command=self.clear) self.clearer.pack(side="left", padx=5, pady=2) self.stopper = tk.Button(self.bottom, text="Stop", command=self.stop) self.stopper.pack(side="left", padx=5, pady=2) self.bottom.pack(side="bottom", fill="both") def clear_text(self): """Clears the Text widget""" self.text.config(state="normal") self.text.delete(1.0, "end-1c") self.text.config(state="disabled") def clear_entry(self): """Clears the Entry command widget""" self.entry.delete(0, "end") def clear(self, event=None): """Does not stop an eventual running process, but just clears the Text and Entry widgets.""" self.clear_entry() self.clear_text() def show(self, message): """Inserts message into the Text wiget""" self.text.config(state="normal") self.text.insert("end", message) self.text.see("end") self.text.config(state="disabled") def start_thread(self, event=None): """Starts a new thread and calls process""" self.stop() self.running = True self.command = self.entry.get() # self.process is called by the Thread's run method threading.Thread(target=self.process).start() def process(self): """Runs in an infinite loop until self.running is False""" while self.running: self.execute() def stop(self): """Stops an eventual running process""" if self.popen: try: self.popen.kill() except ProcessLookupError: pass self.running = False def execute(self): """Keeps inserting line by line into self.text the output of the execution of self.command""" try: # self.popen is a Popen object self.popen = Popen(self.command.split(), stdout=PIPE, bufsize=1) lines_iterator = iter(self.popen.stdout.readline, b"") # poll() return None if the process has not terminated # otherwise poll() returns the process's exit code while self.popen.poll() is None: for line in lines_iterator: self.show(line.decode("utf-8")) self.show("Process " + self.command + " terminated.\n\n") except FileNotFoundError: self.show("Unknown command: " + self.command + "\n\n") except IndexError: self.show("No command entered\n\n") self.stop() if __name__ == "__main__": root = tk.Tk() root.title("Console") Console(root).pack(expand=True, fill="both") root.mainloop() 
    Python ist die beste Programmiersprache der Welt.