Tkinter: отображение метки с автоматически обновляемой переменной - PullRequest
0 голосов
/ 18 апреля 2019

Я знаю, что есть много вопросов по этому вопросу, но после долгих исследований я не нашел ни одного, который мог бы решить мою проблему.

Я пытаюсь отобразить с меткой (используя tkinter) переменную, полученную из шины I²C. Поэтому переменная обновляется очень регулярно и автоматически. Остальная часть окна должна оставаться доступной для пользователя.

На данный момент единственный способ отобразить метку с обновленной переменной и сохранить остальную часть окна доступной для пользователя - это сделать:

window = tk.Tk()
window.title("Gestionnaire de périphériques")
window.minsize(1024,600)

labelValThermo = tk.Label(a_frame_in_the_main_window,text = "")
labelValThermo.grid(row = 1, column = 1)

while True:
    if mcp.get_hot_junction_temperature() != 16.0625:
        labelValThermo.configure(text = "Température thermocouple: {} °C".format(mcp.get_hot_junction_temperature()))
    window.update()
    time.sleep(0.75)

Переменная, полученная из I²C и получившая обновление: mcp.get_hot_junction_temperature

Дело в том, что я знаю, что это не лучший способ принудительного обновления в бесконечном цикле. Это должна быть роль mainloop(). Я обнаружил, что метод after() может решить мою проблему, но я не знаю, как его запустить. Я попробовал следующий код, который не работал:

def displayThermoTemp():
    if mcp.get_hot_junction_temperature() != 16.0625:
        labelValThermo.configure(text = "Température thermocouple: {} °C".format(mcp.get_hot_junction_temperature()))
        labelValThermo.after(500,displayThermoTemp)

window = tk.Tk()

labelValThermo = tk.Label(thermoGraphFrame,text = "")

labelValThermo.after(500, displayThermoTemp)

labelValThermo.grid(row = 1, column = 1)

window.mainloop()

У кого-нибудь есть правильный синтаксис?

Ответы [ 2 ]

2 голосов
/ 18 апреля 2019

после имеет следующий синтаксис:

после (delay_ms, callback = None, * args)

Вам необходимо разместить командув вашей функции обратного вызова и обновите окно, в котором находится виджет (в вашем случае labelValThermo выглядит в окне root:

def displayThermoTemp():
    if mcp.get_hot_junction_temperature() != 16.0625:
        labelValThermo.configure(text = "Température thermocouple: {} °C".format(mcp.get_hot_junction_temperature()))
    root.after(500,displayThermoTemp)
2 голосов
/ 18 апреля 2019

Как использовать after()?

after() вызывает функцию обратного вызова после заданной задержки в мс. Просто определите его внутри данной функции, и он будет работать как цикл while, пока вы не вызовете after_cancel(id).

Вот пример:

import tkinter as tk

Count = 1

root = tk.Tk()
label = tk.Label(root, text=Count, font = ('', 30))
label.pack()

def update():
    global Count
    Count += 1
    label['text'] = Count

    root.after(100, update)

update()

root.mainloop()

Обновите вашу функцию с помощью этого и вызовите ее один раз перед mainloop().

def displayThermoTemp():
    if mcp.get_hot_junction_temperature() != 16.0625:
        labelValThermo.configure(text = "Température thermocouple: {} °C".format(mcp.get_hot_junction_temperature()))
        labelValThermo.after(500,displayThermoTemp)

    # 100ms = 0.1 secs
    window(100, displayThermoTemp)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...