Искам да добавя приспособление за контролен терминал към моето чисто приложение на python+tkinter, подобно на интерпретатора на python, предоставен в Blender. Той трябва да работи в същия контекст (процес), така че потребителят да може да добавя функции и да контролира приложението, което в момента се изпълнява от контролния модул. В идеалния случай бих искал също да "отвлече" stdout и stderr на текущото приложение, така че да докладва за всички проблеми или информация за отстраняване на грешки в работещото приложение.
Това е, което съм измислил досега. Единствените проблеми са, че не отговаря на команди и нишката не спира, когато потребителят затвори прозореца.
import Tkinter as tk
import sys
import code
from threading import *
class Console(tk.Frame):
def __init__(self,parent=None):
tk.Frame.__init__(self, parent)
self.parent = parent
sys.stdout = self
sys.stderr = self
self.createWidgets()
self.consoleThread = ConsoleThread()
self.after(100,self.consoleThread.start)
def write(self,string):
self.ttyText.insert('end', string)
self.ttyText.see('end')
def createWidgets(self):
self.ttyText = tk.Text(self.parent, wrap='word')
self.ttyText.grid(row=0,column=0,sticky=tk.N+tk.S+tk.E+tk.W)
class ConsoleThread(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
vars = globals().copy()
vars.update(locals())
shell = code.InteractiveConsole(vars)
shell.interact()
if __name__ == '__main__':
root = tk.Tk()
root.config(background="red")
main_window = Console(root)
main_window.mainloop()
try:
if root.winfo_exists():
root.destroy()
except:
pass