2017-10-11 92 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的小部件,它可以在图像上看到。 –

相关问题