python - 有没有办法在 tkinter 中将以前的打印覆盖为文本?

标签 python 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()

最佳答案

您本身无法“覆盖”,但您可以使用文本小部件的 delete 方法轻松删除现有文本。

例如,要删除具有光标的当前行,您可以执行以下操作:

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

insert 表示插入光标的位置。 linestartlineend 是修饰符,分别将索引调整为行的开头或结尾。

关于python - 有没有办法在 tkinter 中将以前的打印覆盖为文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46696409/

相关文章:

python - 将一列中的数据分成三列

python - 如何可视化神经网络

python - 使用 Google App Engine 的 Channel API 和开发服务器时出现 JavaScript 错误

python - 计算每个 ID Pandas 每行的日期范围内有多少行的日期

Python子进程将输出返回到列表中

python - 如何在 tkinter 中插入特殊字符

python - Tkinter 标签文本在特定循环中重叠

python - 如何为我的主窗口设置最小和最大调整大小?

python - Tkinter 按钮未定义

python - 在ttk Treeview中设置多个选定的项目