【问题标题】:How to use Tkinter with Real Time database updates如何使用 Tkinter 进行实时数据库更新
【发布时间】:2021-04-16 09:18:50
【问题描述】:

谁能帮帮我。我正在使用两个数据库(srcdb、maindb)并进行了一个 sql 查询,该查询从scrdb 获取数据并检查是否插入了新数据。如果有新数据,它会更新maindb

我正在使用此代码使其成为实时的。 (没问题)

while True:
  query.UpdateStats()
  query.UpdateCounts()

我现在如何在 Tkinter 中实现上述代码我在更新函数中插入了查询,但它每隔 1 秒调用一次函数。

每当其中的循环结束时,我都需要运行查询。

root = Tk()
root.title('Title')
root.geometry("400x200")

def update():
  dt_str = datetime.today().strftime("%m/%d/%y - %I:%M:%S %p")
  dtCurrent_label.config(text=dt_str)
  query.UpdateStats()
  query.UpdateCounts()
  dtCurrent_label.after(1000, update)

dtCurrent_label = Label(root, text="", fg="green", font=("", 11))
dtCurrent_label.pack(pady=(0, 10))

update()
root.mainloop()

还有如何在没有控制台的情况下运行它,它不适用于 .pyw,我不知道如果我使用 pyinstaller 是否可以工作,因为我正在使用其他 python 文件。

【问题讨论】:

  • 我假设您正在使用 Windows。另外,query.UpdateStats()query.UpdateCounts() 调用需要多少时间?如果时间很短,我认为您的程序中的其他内容是错误的。你能发布你的完整代码吗?
  • 是的,我正在使用 Windows。这实际上取决于是否插入了新数据。查询的主要功能是澄清 datetime(srcDb) 是否大于 mainDb 的 datetime,这就是我确定是否需要更新的方式。由于其结构复杂,我实际上无法发布查询。我必须将一些字符串值转换为 datetime 才能使其工作。 PS:我没有创建数据库,我不允许修改它。
  • 好吧,如果我用print("Updating") 替换query.UpdateStats()query.UpdateCounts(),它就可以正常工作。当您说使用.pyw 运行它时它不起作用时,您是什么意思?它没有出现在您的屏幕上吗?
  • 替换查询是什么意思?你在更新功能上换了吗?我确实将 .py 替换为 .pyw 以使其成为 exe 文件,因此我不需要在控制台中输入来打开 tkinter,但它不起作用,我仍在尝试寻找替代方案。
  • 因为我不知道query.UpdateStats()query.UpdateCounts() 是如何工作的,所以我用一个简单的print 语句替换了它们以进行调试。当我这样做时,print 语句每 1 秒执行一次。

标签: python python-3.x tkinter


【解决方案1】:

使用多线程处理:

from datetime import datetime
from threading import Thread
from tkinter import Tk, Label

root = Tk()
root.title('Title')
root.geometry("400x200")


def update():
    while True:
        dt_str = datetime.today().strftime("%m/%d/%y - %I:%M:%S %p")
        dtCurrent_label.config(text=dt_str)
        query.UpdateStats()
        query.UpdateCounts()


dtCurrent_label = Label(root, text="", fg="green", font=("", 11))
dtCurrent_label.pack(pady=(0, 10))

Thread(target=update).start()
root.mainloop()

或者只是将dtCurrent_label.after(1000, update) 更改为dtCurrent_label.after(1, update)

【讨论】:

  • 在使用tkinter 时不要使用线程。它可能会崩溃 tkinter 而不会给你一个错误。 从不在使用tkinter时使用threading
  • @TheLizzard 不建议在线程任务中更新 tkinter 小部件,因为 tkinter 不是线程安全的。如果线程任务正在做某事而不更新 tkinter 小部件,它可以与 tkinter 共存。
  • @acw1668 在这种情况下,它在tkinter.Label 上调用.config。一般来说,在创建 tkinter.Tk() 的线程之外的线程中使用 tkinter 小部件并不是一个好主意。
  • @TheLizzard 我只想指出,您的声明“在使用tkinter从不使用threading”在某些情况下无效。
猜你喜欢
  • 2020-10-18
  • 2011-11-27
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 2011-05-22
相关资源
最近更新 更多