Python Tkinter, как обновить таблицу с живыми данными? - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь обновить свою таблицу Tkinter живыми данными. Пока что мне удалось создать GUI и установить значения из API в метках таблицы. Однако я не могу обновить его после запуска главного окна l oop. Вот пример моего кода:

from __future__ import print_function
from tkinter import *
from tkinter import Label,Frame,Tk, Scale, StringVar
from tkinter.ttk import Notebook, Entry
def getValue(value):
    print(value)

window = Tk()
window.title("Table GUI")
window.configure(bg="pink")
window.geometry("300x305")



varas1=StringVar()
varas2=StringVar()
varas3=StringVar()


vara1=StringVar()
vara2=StringVar()
vara3=StringVar()


varp1=StringVar()
varp2=StringVar()
varp3=StringVar()

varb1=StringVar()
varb2=StringVar()
varb3=StringVar()




frame2=Frame(window)
frame2.pack(fill="both")

tablayout=Notebook(frame2)

tab1=Frame(tablayout)

for row in range(11):
    for column in range (3):

    if row==0 and column==0:
        label= Label(tab1,text="Headline1", bg="green", fg="blue", padx=3, pady=3)
        label.config(font=('Arial',16))
        label.grid(row=row,column=column,sticky="nsew", padx=1, pady=1)
        tab1.grid_columnconfigure(column, weight=1)

    if row==1 and column==2:
        label = Label(tab1,textvar=vara1,bg="pink", fg="Red", padx=3, pady=3) #Entry or Label with colours
        label.grid(row=row,column=column,sticky="nsew", padx=1, pady=1)
        tab1.grid_columnconfigure(column, weight=1)

    if row==2 and column==2:
        label = Label(tab1,textvar=vara2,bg="pink", fg="Red", padx=3, pady=3) #Entry or Label with colours
        label.grid(row=row,column=column,sticky="nsew", padx=1, pady=1)
        tab1.grid_columnconfigure(column, weight=1)

    if row==3 and column==2:
        label = Label(tab1,textvar=vara3,bg="pink", fg="Red", padx=3, pady=3) #Entry or Label with colours
        label.grid(row=row,column=column,sticky="nsew", padx=1, pady=1)
        tab1.grid_columnconfigure(column, weight=1)

tablayout.pack(fill="both")

Затем я помещаю функцию, которая через некоторое время запрашивает веб-сокет. L oop

While true:
    Retrievedatafromwsusingaconnector()
    vara=apiresult['dataA']
    VarA[(vara[0]),
         (vara[1]),
         (vara[2])]    

И, наконец, я связываю переменные, полученные из веб-сокета к тем, которые я определил ранее:

varas3.set(VarA[0]) 
varas2.set(VarA[1]) 
varas1.set(VarA[2])

Затем запустите mainl oop:

window.mainloop()

Я прочитал в другом подобном посте (Python Tkinter, Display Live Data ), что я мог бы использовать функцию windows .update (), но я не могу понять, как я могу отдельно запускать запросы ws из windows .mainl oop () при одновременном обновлении меток таблицы. Возможно, я мог бы сделать это асинхронно из того же кода? Или мне нужно создать обновленную базу данных и просто прочитать ее Tkinter? Спасибо

1 Ответ

0 голосов
/ 21 января 2020

Когда ваш скрипт попадает в mainl oop (), он останавливается и больше ничего не делает. Есть несколько способов обойти это. Первый вариант вместо mainl oop (), поместите ваш запрос ie через некоторое время True l oop с window.update () в конце. Таким образом, вы создали свой собственный l oop, который обновляет Tkinter, как mainl oop (), но который все же позволяет вам запускать код внутри l oop. Второй вариант - иметь функцию quer ie, которая через некоторое время будет вызывать себя снова, используя метод after виджета. Вы можете прочитать об этом здесь: https://effbot.org/tkinterbook/widget.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...