我想使用Text小部件创建GUI命令行。出于调试目的,我试图将用户输入的任何内容打印到系统终端的单独GUI窗口中。我知道将GUI和基于文本的命令混合到同一个脚本中是不赞成的,但我只是在调试,所以请原谅我 这是我的代码:
from Tkinter import *
main = Tk()
console = Text(main)
console.pack()
main.mainloop()
while True:
text = console.get("1.0", "end-1c")
print(text)
我目前的问题是,当mainloop启动时,(当然)while循环没有。如果我要在mainloop调用前移动while循环,它将永远不会调用mainloop。我真的希望它不断检查新文本。
有没有办法喜欢“暂停”主循环,或只是执行命令,可能是在一个新的线程或什么的?
我想避免使用main.after(),但如果这是唯一的方法,那就这样吧。 ¯\(°_O)/¯
答案 0 :(得分:1)
我建议使用main.after()
,因为这是在Tkinter中执行此类操作的规范方法。以下内容还将确保它只尝试每秒打印一次,而不是像控制台可以处理的那样快(因为代码中的while
循环会起作用)。
def print_console():
print(console.get("1.0", "end-1c"))
main.after(1000, print_console)
print_console()
main.mainloop()
答案 1 :(得分:1)
您还可以将小部件绑定到“已修改”
from Tkinter import *
class TextModified():
def __init__(self):
root = Tk()
self.txt = Text(root)
self.txt.pack()
self.txt.focus_set()
self.txt.bind('<<Modified>>', self.changed)
Button(text='Exit', command=root.quit).pack()
root.mainloop()
def changed(self, value=None):
flag = self.txt.edit_modified()
if flag: # prevent from getting called twice
print "changed called", self.txt.get("1.0", "end-1c")
## reset so this will be called on the next change
self.txt.edit_modified(False)
TM=TextModified()