有一个简单的程序,有两个文本和一个按钮小部件。
第一个文本小部件用于编写按下“运行”按钮后将执行的代码。第二个文本小部件用于用作 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()
最佳答案
您本身无法“覆盖”,但您可以使用文本小部件的 delete
方法轻松删除现有文本。
例如,要删除具有光标的当前行,您可以执行以下操作:
self.StdOut.delete("insert linestart", "insert lineend")
insert
表示插入光标的位置。 linestart
和 lineend
是修饰符,分别将索引调整为行的开头或结尾。
关于python - 有没有办法在 tkinter 中将以前的打印覆盖为文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46696409/