使用Tkinter Listbox替代打印

时间:2019-02-21 18:32:08

标签: python user-interface tkinter listbox

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

1 个答案:

答案 0 :(得分:1)

当您希望在GUI应用程序的后台运行计算时,需要使用多线程或多处理。这是因为在等待功能运行时,GUI将冻结。如果您使用OOP(面向对象编程)结构来构建GUI,这些过程将变得更加容易。使用OOP将使它成为可能,因此您可以将GUI传递给线程,并且一旦准备就绪,它将写入“ HI”或“ Hi再次”,而不会造成滞后问题。这是我制作的一个简单的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一天到现在的工作时间以及您赚了多少钱!