在Tkinter中调用mainloop()后如何执行操作?

时间:2015-08-04 23:38:42

标签: python python-2.7 user-interface tkinter

我想使用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)/¯

2 个答案:

答案 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()