使用 Tkinter 列表框作为打印的替代方法

Using Tkinter Listbox as an alternative to printing

我正在用 Tkinter 制作一个 GUI 程序,并制作了一个列表框以便在其中打印一些句子,我使用了列表框的 .insert 方法,但问题是,该程序在后台运行并且然后一起打印所有内容,A 造成滞后问题,B 这不是我想要的。现在我想要实现的是在代码中触发后立即插入每个项目,例如:l1.insert(END,'Hi') ---- a=1+1 - --- l1.insert(结束,'Hi again') 我希望 'Hi' 在列表框中可见,然后程序计算 a,然后插入 'Hi again',而不是执行所有操作并一次打印所有内容。 这是可能的还是我应该寻找另一种方法?请指定一些可行的方法。

当您希望在 GUI 应用程序的后台进行 运行 计算时,您需要使用多线程或多处理。这是因为您的 GUI 在等待函数 运行 时会冻结。如果您使用 OOP(面向对象编程)结构构建 GUI,这些过程会变得更容易。使用 OOP 可以做到这一点,因此您可以将 GUI 传递给线程,一旦准备就绪,它就会写入 "HI" 或 "Hi again" 而不会产生滞后问题。这是我制作的一个简单的 OOP 线程 GUI 示例。

import tkinter as tk
from threading import Thread
import time
import datetime


class OOP:
    def __init__(self):
        self.win = tk.Tk()
        self.win.attributes('-topmost', True)
        self.win.geometry(newGeometry="%dx%d%+d%+d" % (45, 40, 50, 50))
        self.start_time = time.time()
        self.current_pay = tk.StringVar()
        self.time_output = tk.StringVar()
        tk.Label(self.win, textvariable=self.time_output, bg="#450609", fg='white').pack(expand=1, fill='both')
        tk.Label(self.win, textvariable=self.current_pay, bg="#450609", fg='white').pack(expand=1, fill='both')
        self.create_thread()

    def calculate_pay(self):
        pay_rate = 2000.00 #made up hourly wage for Stack Overflow post
        now = time.time()
        elapsed = datetime.timedelta(seconds=(now - self.start_time))
        hours = int(elapsed.seconds/3600)
        minutes = int(((elapsed.seconds / 3600) - hours) * 60)
        seconds = int(((((elapsed.seconds / 3600) - hours) * 60) - minutes) * 60)
        self.current_pay.set('$%.2f' % ((elapsed.seconds / 3600) * pay_rate))
        self.time_output.set('{}:{}:{}'.format(hours, minutes, seconds))

    def method_in_a_thread(self):
        while True:
            self.calculate_pay()
            time.sleep(.3)
            self.win.lift()

    def create_thread(self):
        self.run_thread = Thread(target=self.method_in_a_thread)
        self.run_thread.start()


app = OOP()
app.win.mainloop()

此 GUI 已针对多行发布目的进行了调整,但我认为可以帮助向您展示我如何创建一个永远 运行 的线程(您的线程不必以任何方式)并使用该线程更新可见的 GUI!在不到 50 行的代码中,您可以获得一个时钟,显示您工作了多长时间以及当天到目前为止您赚了多少钱 XD!