基于 Tkinter 的 GUI 在代码执行后显示代码输出,而不是实时显示

问题描述 投票:0回答:0

我正在开发一个 GUI,它允许我在文本框中输入一些数据,单击一个按钮,然后它运行第二个 Python 脚本,该脚本使用该文本作为变量。第二个脚本有各种打印语句,我用它来显示执行进度。 GUI 还有另一个文本框,我用它来显示第二个脚本的输出。

我可以运行代码来启动 GUI,输入文本并在单击按钮后运行第二个脚本。问题是脚本的输出是在所有第二个代码执行后显示的,而不是实时显示的(在执行时)。因此我无法实时监控代码的执行。

我的第一个代码,设置 GUI 是:

import tkinter as tk
import subprocess

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        # Create a label and entry widget for user input
        self.input_label = tk.Label(self, text="Ingresa el valor:")
        self.input_label.pack(side="left")
        self.input_entry = tk.Entry(self)
        self.input_entry.pack(side="left")

        # Create a button to save user input to a file and run second script
        self.run_button = tk.Button(self, text="Hacé click", command=self.save_and_run)
        self.run_button.pack(side="left")

        # Create a text widget to display output from second script
        self.output_text = tk.Text(self, height=10, width=50)
        self.output_text.pack()

    def save_and_run(self):
        # Save user input to a file
        data = self.input_entry.get()
        with open("data.txt", "w") as f:
            f.write(data)

        # Run second script and display output in text widget
        output = subprocess.check_output(["python", "programa.py"])
        self.output_text.insert(tk.END, output.decode())

root = tk.Tk()
app = Application(master=root)
app.mainloop()

在此代码中,“programa.py”是我的第二个代码。它有点复杂,所以假设我想运行这个更简单的代码(我不使用输入文本作为变量)。

from time import sleep

for second in range(3, 0, -1):
    print(second, flush=True)
    sleep(1)
print("Go!")

在这种情况下,3 秒后,GUI 上的文本框将显示:

3
2
1
Go!

它会一次显示所有内容,而不是像在终端上那样显示它。

那么我该怎么做才能让 GUI 实时显示我的代码的输出,而不是在代码执行完成之后?我试过在打印语句中设置 flush=True 但它没有用。

python user-interface tkinter printing subprocess
© www.soinside.com 2019 - 2024. All rights reserved.