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的小部件,它可以在圖像上看到。 –