1
有一个简单的程序,它有两个文本和一个按钮小部件。有没有办法在tkinter上覆盖之前的打印文本?
第一个文本小部件用于编写在按下“运行”按钮后执行的代码。第二个文本小部件用作stdout和stderr。
我一直在试图用“\ r”覆盖前面的打印语句。但结果并非如我所愿。
在完成所有过程后激活after命令。
我该怎么做才能覆盖以前的打印语句,有没有办法?
这里是代码:
#!/usr/bin/env python3
# -*- coding: utf -*-
import sys
import tkinter as tk
import time
class StdIORedirector:
def __init__(self, text):
self.text = text
def write(self, string):
self.text.insert("end", string)
def flush(self):
self.text.update_idletasks()
class App(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.grid(row=0, column=0)
self.WriteIn = tk.Text(master=self)
self.WriteIn.grid(row=0, column=0)
self.StdOut = tk.Text(master=self)
self.StdOut.grid(row=0, column=2)
sys.stdout = StdIORedirector(self.StdOut)
sys.stderr = StdIORedirector(self.StdOut)
self.RunButton = tk.Button(master=self, text="Run")
self.RunButton.grid(row=0, column=1)
self.RunButton.configure(command=self.run)
def run(self):
self.StdOut.delete("1.0", "end")
if "\\r" in self.WriteIn.get("1.0", "end"):
print("Start")
self.master.after(1, self.overwrite)
time.sleep(2)
print("End")
exec(self.WriteIn.get("1.0", "end"))
def overwrite(self):
self.StdOut.delete("1.0", "end")
self.master.after(1, self.overwrite)
if __name__ == "__main__":
root = tk.Tk()
app = App(master=root)
app.mainloop()
循环结束后可以删除该行。但是我想在执行for循环时删除这一行。它应该打印“1”,然后删除“1”,然后打印“2”,然后删除“2”...直到循环结束。 –
@dildeolupbiten:我在代码中没有看到for循环,但是您可以随时调用delete,包括for循环。 –
for循环在文本小部件中写入了名称为WriteIn的小部件,它可以在图像上看到。 –