2017-10-11 83 views
1

有一個簡單的程序,它有兩個文本和一個按鈕小部件。有沒有辦法在tkinter上覆蓋之前的打印文本?

第一個文本小部件用於編寫在按下「運行」按鈕後執行的代碼。第二個文本小部件用作stdout和stderr。

我一直在試圖用「\ r」覆蓋前面的打印語句。但結果並非如我所願。

在完成所有過程後激活after命令。

我該怎麼做才能覆蓋以前的打印語句,有沒有辦法?

https://i.hizliresim.com/bLb41b.png

這裏是代碼:

#!/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() 

回答

1

你不能「覆蓋」 本身,但你可以很容易地使用文本組件的delete方法刪除現有的文本。

例如,刪除具有光標,你可以做當前行:

self.StdOut.delete("insert linestart", "insert lineend") 

insert代表插入光標的位置。 linestartlineend分別是將索引調整爲行的開始或結束的修飾符。

+0

循環結束後可以刪除該行。但是我想在執行for循環時刪除這一行。它應該打印「1」,然後刪除「1」,然後打印「2」,然後刪除「2」...直到循環結束。 –

+0

@dildeolupbiten:我在代碼中沒有看到for循環,但是您可以隨時調用delete,包括for循環。 –

+0

for循環在文本小部件中寫入了名稱爲WriteIn的小部件,它可以在圖像上看到。 –

相關問題