我正在使用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()
但是,当我尝试折叠窗口或切换到另一个应用程序时,它会冻结。另一件事是我希望它向下滚动并在到达窗口末尾时显示新输出。我将不胜感激这些问题的任何帮助。
答案 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)
这现在同时在console
和output 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()