在tkinter中将控制台输出到GUI的问题

时间:2016-04-22 13:38:53

标签: python user-interface tkinter console

我正在使用tkinter。 我有以下代码在实时模式下将控制台输出打印到GUI。现在它很简单地打印数字(需要延迟以便我可以看到它在现实生活中)。

import tkinter as tk
import time
import sys

class Display(tk.Frame):
    def __init__(self):
       tk.Frame.__init__(self)
       self.doIt = tk.Button(self,text="Start", command=self.start, background = 'black', fg='white')
       self.doIt.pack()
       self.output = tk.Text(self, width=100, height=15, background = 'black', fg='white')
       self.output.pack()
       sys.stdout = self
       self.configure(background='black')
       self.pack()


    def start(self):
        for i in range (1, 1000):
            print (i)
            time.sleep(2)


    def write(self, txt):
        self.output.insert(tk.END,str(txt))
        self.update_idletasks()


if __name__ == '__main__':
    Display().mainloop()

但是,当我尝试折叠窗口或切换到另一个应用程序时,它会冻结。另一件事是我希望它向下滚动并在到达窗口末尾时显示新输出。我将不胜感激这些问题的任何帮助。

2 个答案:

答案 0 :(得分:2)

我建议您不要在Tkinter事件循环中使用time.sleep(),因为它会导致应用程序在睡眠调用期间无响应。因此,我建议您使用.after()调用。

关于滚动,您只需要在文本小部件中添加滚动条。这是一个例子:

import tkinter as tk
import time
import sys

class Display(tk.Frame):
    def __init__(self):
       tk.Frame.__init__(self)
       self.doIt = tk.Button(self,text="Start", command=self.start, background = 'black', fg='white')
       self.doIt.pack()

       self.output = tk.Text(self, width=100, height=15, background = 'black', fg='white')
       self.output.pack(side=tk.LEFT)

       self.scrollbar = tk.Scrollbar(self, orient="vertical", command = self.output.yview)
       self.scrollbar.pack(side=tk.RIGHT, fill="y")

       self.output['yscrollcommand'] = self.scrollbar.set

       self.count = 1
       self.configure(background='black')
       self.pack()


    def start(self):
        if self.count < 1000:
            self.write(str(self.count) + '\n')
            print (self.count)
            self.count += 1
            self.after(2000, self.start)


    def write(self, txt):
        self.output.insert(tk.END,str(txt))
        self.update_idletasks()


if __name__ == '__main__':
    Display().mainloop()

答案 1 :(得分:1)

这现在同时在consoleoutput tk window中输出:缺少的是对self.write()的调用。我还禁止将sysout转移到窗口。

import tkinter as tk
import time
import sys

class Display(tk.Frame):
    def __init__(self):
       tk.Frame.__init__(self)
       self.doIt = tk.Button(self,text="Start", command=self.start, background = 'black', fg='white')
       self.doIt.pack()
       self.output = tk.Text(self, width=100, height=15, background = 'black', fg='white')
       self.output.pack()
#       sys.stdout = self
       self.configure(background='black')
       self.pack()


    def start(self):
        for i in range (1, 1000):
            self.write(str(i) + '\n')
            print (i)
            time.sleep(2)


    def write(self, txt):
        self.output.insert(tk.END,str(txt))
        self.update_idletasks()


if __name__ == '__main__':
    Display().mainloop()