我正在开发一个 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 但它没有用。