Как обновлять содержимое окна Python Tkinter каждые 60 секунд - PullRequest
0 голосов
/ 05 октября 2018

У меня есть программа на Python, которая обращается к базам данных для вещей, которые должны отображаться на экране.Его цель - показать, когда заказ человека готов к приему.У меня есть весь код, чтобы получить данные и отобразить их в окне.Однако мне нужно каждые 60 секунд повторно запрашивать базы данных, так как некоторые заказы будут подобраны и должны исчезнуть из списка, а некоторые должны быть добавлены.Я просто не знаю, как это сделать, так как кажется, что после вызова app.mainloop () требуется взаимодействие человека с окном, чтобы что-то произошло.Любая помощь будет принята с благодарностью ... Извините за то, что вы долго наматывались!

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Вот что я закончил.Кажется, делать то, что мне нужно.Спасибо за помощь, это было на месте.

class Application(tk.Frame):
    def __init__(self,master=None):
    self.createWidgets()

    def createWidgets(self):
        tk.Frame.__init__(self)
        self.pack()
        for b in range(0,int(len(myItems)/2)):
            #print (myItems[b])
            self.btn = tk.Button(self)
            self.btn["text"] = myItems[b,0]
            # self.btn["command"] = (lambda tck=b, binst=btn : pickUp(tck, binst))
            # self.btn["command"] =  lambda ticketNo=myItems[b,1] : self.pickUp(ticketNo)
            self.btn.pack(fill='x')

    def pp(self) :
        #print('Im in pp')
        self.destroy()
        getArrowDataAndUpdateSQLite()
        myItems = getDisplayData()
        app.createWidgets()
        app.master.after(30000, self.pp)

app = Application()
app.master.title('Customer Order Status')
app.master.after(30000,app.pp)
app.mainloop()
0 голосов
/ 05 октября 2018

Вот пример, который я собрал вместе, чтобы показать вам некоторые основы того, как вы можете использовать after() для проверки очень большого количества секунд для обновления вашего трекера.

Дайте мне знать, если у вас есть какие-либо вопросы.

import tkinter as tk


class Example(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.geometry("600x400")
        self.current_ticket_number = 1
        self.data = [[97, "Mike"], [98, "Kaite"], [99, "Tom"]]

        self.display_frame = tk.Frame(self)
        self.display_frame.grid(row=2, column=0, columnspan=3, sticky="nsew")

        self.lbl1 = tk.Label(self, text="Next ticket number: {}".format(self.current_ticket_number))
        self.lbl1.grid(row=0, column=0)
        self.lbl2 = tk.Label(self, text="Customer Name: ".format(self.current_ticket_number))
        self.lbl2.grid(row=0, column=1)
        self.entry1 = tk.Entry(self)
        self.entry1.grid(row=0, column=2)

        tk.Button(self, text="Refresh List", command=self.refresh).grid(row=1, column=0, pady=5)
        tk.Button(self, text="Submit new ticket", command=self.new_ticket).grid(row=1, column=1, pady=5)

        self.timed_refresh()

    def new_ticket(self):
        x = self.entry1.get().strip()
        if x != "":
            self.data.append([self.current_ticket_number, x])
            #self.refresh() # you could do self.refresh() here if you want to update as soon as you create a ticket
            #I left it out though so you can see how after() works below.
            if self.current_ticket_number >= 99:
                self.current_ticket_number = 1
            else:
                self.current_ticket_number += 1

    def refresh(self):
        self.display_frame.destroy()
        self.display_frame = tk.Frame(self)
        self.display_frame.grid(row=2, column=0, columnspan=3, sticky="nsew")
        for ndex, item in enumerate(self.data):
            tk.Label(self.display_frame, text=r"Order #{} is ready for {}.".format(item[0], item[1])).grid(row=ndex, column=1)
            tk.Button(self.display_frame, text=r"Remove Ticket".format(item[0], item[1]), command=lambda x=ndex: self.remove_ticket(x)).grid(row=ndex, column=0)

    def remove_ticket(self, ndex):
        self.data.pop(ndex)
        self.refresh()

    def timed_refresh(self):
        #this after statement is set for every 6 seconds
        self.after(6000, self.timed_refresh)
        self.refresh()

if __name__ == "__main__":
    Example().mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...