Wie kann ich einen Python Interpreter Frame in Python mit tkinter einbetten?

8

Ich möchte meiner pure python + tkinter-Anwendung ein Steuerelement-Terminal-Widget hinzufügen, das dem in Blender bereitgestellten Python-Interpreter ähnelt. Es sollte im selben Kontext (Prozess) ausgeführt werden, damit der Benutzer Features hinzufügen und die Anwendung steuern kann, die derzeit über das Steuerelement-Widget ausgeführt wird. Idealerweise möchte ich, dass stdout und stderr der aktuellen Anwendung ebenfalls "gehijacked" werden, so dass Probleme oder Debugging-Informationen in der laufenden Anwendung gemeldet werden.

Das ist, was ich bisher herausgefunden habe. Die einzigen Probleme sind, dass es nicht auf Befehle reagiert und der Thread nicht stoppt, wenn der Benutzer das Fenster schließt.

%Vor%     
Ralph Ritoch 16.02.2014, 13:03
quelle

1 Antwort

2

Ich habe die Antwort, falls es noch jemanden interessiert! (Ich habe auch zu Python 3 gewechselt, daher die import tkinter anstatt import Tkinter )

Ich habe den Ansatz leicht vom Original geändert, indem ich eine separate Datei verwendet habe, um InteractiveConsole auszuführen, und dann die Hauptdatei öffnen, um diese andere Datei zu öffnen (die ich console.py genannt habe und in der gleich ist Verzeichnis ) in einem Subprozess, wobei stdout, stderr und stdin dieses Unterprozesses programmatisch mit dem tkinter Text-Widget verknüpft werden.

Hier ist der Code in der für die Konsolendatei (wenn dies normal ausgeführt wird, verhält es sich wie eine normale Konsole):

%Vor%

Und hier ist der Code für den Python-Interpreter, der die Konsole im Text-Widget ausführt:

%Vor%

Der Grund dafür, dass das Lesen von stdout und stderr in separaten Threads erfolgt, liegt daran, dass die read-Methode blockiert, was dazu führt, dass das Programm einfriert, bis der console.py-Subprozess mehr Ausgaben liefert, es sei denn, diese befinden sich in separaten Threads. Die writeLoop-Methode und die Warteschlangen werden benötigt, um in das Text-Widget zu schreiben, da tkinter nicht threadsicher ist.

Das hat sicherlich immer noch Probleme, auszubügeln, wie die Tatsache, dass jeder Code im Text-Widget bearbeitet werden kann, auch wenn er bereits einmal eingereicht wurde, aber hoffentlich beantwortet er Ihre Frage.

BEARBEITEN: Ich habe auch einige der tkinter so eingestellt, dass sich die Konsole mehr wie ein Standard-Widget verhält.

    
Oli 03.10.2017 13:10
quelle

Tags und Links