在 Python 中,如何让 GUI 持续运行,但它会不断从数据库中获取数据以进行实时更新?

问题描述

我想要实现的想法是始终显示下面显示的 GUI,但是让下面的代码始终更新并从数据库提取以在添加删除新信息时实时更新 GUI。

我想先制作 GUI 组件,然后在函数中从数据库提取添加信息,我有一个 schedule.every(1).minutes.do(getMedinfo) 不断地做这个功能。它每分钟执行一次,但不显示 GUI。

我知道数据库工作正常,因为如果我添加新信息,它会被添加但我必须重新编译。关于如何让 GUI 始终与代码添加删除实时同步的任何想法?提前致谢

def getMedinfo():

    initialxPlacement = 0.05
    initialyPlacement = 0.32

    initxPlaceNext = 0.56
    inityPlaceNext = 0.32

    for i in medicationSchedule:
        tiMetaken = i['TiMetaken']
        dayTaken = i['DayTaken']
        medname = i['MedicationName']
        mednames = Label(text= medname + " taken every " + dayTaken + " at " + converttwentyfourhour(tiMetaken),background = "#1e3f66",foreground = "white",font = "Arial 10 bold")
        mednames.place(relx = initialxPlacement,rely = initialyPlacement,anchor = 'w')

        # figure out if the pill drops today
        isDay = isDayOfWeek(dayTaken)

        if isDay == 1:
            label =  Label(text= medname + " taken every " + dayTaken + " at " + converttwentyfourhour(tiMetaken),font = "Arial 10 bold")
            label.place(relx = initxPlaceNext,rely = inityPlaceNext,anchor = 'w')

        initialyPlacement += 0.05
        inityPlaceNext += 0.05

# def getUserInfoScreen():

# Begin Initial Window
window = Tk(className = 'Magic Meds')
datelabel = Label(background = "#1e3f66",font = "Arial 15 bold")
timelabel = Label(background = "#1e3f66",font = "Arial 15 bold")


user = GetUserData.userdata()
date = GetUserData.getSystemDate()
timel = GetUserData.getSystemTime()

user = GetUserData.userdata()
medicationSchedule = GetUserData.getMedications(str(user["_id"]))
amountOfMeds = len(medicationSchedule)

# greeting.place_forget()
# A.place_forget()
# canvas.place_forget()
# canvas.place(relx=0.62,rely=0.004)

usersName = Label(text= user['FirstName'] + " " + user['LastName'] + "s " + "Pill Schedule",font = "Arial 15 bold")
usersName.place(relx = 0.455,rely = 0.1,anchor = 'center')

medBox = Canvas(window,width = 765,height = 365,highlightthickness=2,highlightcolor = "#c66156")  
medBox.place(relx=0.02,rely=0.2)

getMedinfo()


weeklySched = Label(text= "Weekly Schedule",font = "Arial 15 bold")
weeklySched.place(relx = 0.22,rely = 0.25,anchor = 'center')

upNext = Label(text= "Pill(s) Dropping Today",font = "Arial 15 bold")
upNext.place(relx = 0.74,anchor = 'center')

schedule.every(1).minutes.do(getMedinfo)

while True:
    schedule.run_pending()
    time.sleep(10) 

GUI Display

解决方法

  1. 编写一个执行查询并更新显示的函数。
  2. 编写一个每分钟调用一次该函数的函数。

看起来像这样:

def do_update():
    <your code to fetch the data and update the display>

def run_every_minute():
    do_update()
    root.after(60000,run_every_minute)

当然,您必须开始 mainloop。在您调用 run_every_minute() 一次后,它将继续每分钟运行一次。这个网站上有很多很多关于这种模式的例子。搜索“动画”或“计时器”或“时钟”。

注意:此策略仅在 do_update() 花费的时间少于几百毫秒时才有效。如果需要更长的时间,您可能希望在单独的线程或进程中获取数据。大多数数据库可以足够快地执行查询。