Как обновить графический интерфейс Python?

Я хочу обновлять свой графический интерфейс каждую секунду (на самом деле меня не волнует время, но оно должно быть как в реальном времени). У меня есть скрипт, где на самом деле метка как целое число должна увеличиваться на единицу и отображаться. Но я не получаю изменений, также я хочу разместить метку в соответствии с шириной корня, но она не обновляется. Только с обновлением проблема, может кто поможет с этим. (Я новичок-нуб).

Скрипт:


from tkinter import *
import time

c = 0
root = Tk()
root.title("Real Time Plot")
root.minsize(width = 200, height = 300)
m = root.winfo_reqwidth() / 2

root.update()
Text = Label(root, text = c)
Text.place(x =m, y = 150)
c = c + 1
print(m)

root.mainloop()
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
125
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы обновляете только значение переменной, а не значение метки. Вам нужно обновить метку содержимым c после ее увеличения:

Text.configure(text=c)

Так что получается что-то вроде этого:

from tkinter import *
import time

c = 0
root = Tk()
root.title("Real Time Plot")
root.minsize(width = 200, height = 300)
m = root.winfo_reqwidth() / 2

root.update()
Text = Label(root, text = c)
Text.place(x =m, y = 150)
root.update()

time.sleep(2)
c = c + 1
Text.configure(text=c)
root.update()

print(m)

root.mainloop()

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

Не работает. Значение изменяется с 0 на 1 и останавливается на достигнутом.

Samaksh Gupta 19.12.2020 15:31

ОП написал: «Проблема только с обновлением, может быть, кто-то может мне помочь с этим». Предоставленный код обновляет значение и четко объясняет, как это сделать. Так что, возможно, вам следует быть более осторожным при комментировании решений, предоставленных другими.

emmunaf 19.12.2020 16:50

Говоря об OP, он четко сказал слово Realtime, которое, я уверен, вы пропустили. Кроме того, он сказал разместить метку в соответствии с шириной корня, что вы тоже пропустили. Тогда, возможно, вам следует внимательно прочитать проблему или хотя бы сделать рабочий код.

Samaksh Gupta 19.12.2020 16:53

Всем спасибо за быстрый ответ. @Samaksh Gupta, я посмотрел ваш код и нашел альтернативу для проблемы с шириной и высотой: root_height = root.winfo_height() root_height = int(root_height) Возможно только с помощью вашего кода, спасибо :)

TheRealIndianBoi 19.12.2020 17:46
Ответ принят как подходящий

Вы должны использовать Python Threading, который сделает это безупречно!

Вот код:

from tkinter import *
import threading
import time

def realtime_update():
    while True:
        global c, Text
        c += 1
        Text.configure(text=c+1)
        time.sleep(0.001)
        root_width = root.winfo_geometry()
        root_width = root_width.split('x')
        root_width = int(root_width[0])

        Text.place(x=root_width/2, y=150)
        time.sleep(0.01)

c = 0
root = Tk()
root.title("Real Time Plot")
root.minsize(width = 200, height = 300)
m = root.winfo_reqwidth() / 2

Text = Label(root, text = c)
Text.place(x=int(m), y = 150)
print(m)
threading.Thread(target=realtime_update, daemon=True).start()
root.mainloop()

Он решает следующее:

  1. Обновление в реальном времени (точность до 0,01 с)
  2. Метка меняет положение при изменении размера корневого окна

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

Сначала создайте StringVar:

текст = StringVar (значение = "текст")

Затем создайте метку с текстовой переменной. ваша метка = метка (корень, текстовая переменная = текст)

А затем просто создайте функцию, которая будет обновлять вашу метку: yourlabel.set(и здесь вы передаете новое значение)

Итак, ваш yourlabel будет иметь значение, которое вы передали. Итак, вы можете использовать что-то вроде self.after для обновления функции каждые 1000 мс.

Я просто хотел знать, как обновить графический интерфейс tkinter, но спасибо за ответ.

TheRealIndianBoi 19.12.2020 18:29

Другие вопросы по теме