Как заставить кнопку tkinter взаимодействовать с моим скриптом?

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

По сути, я хочу запустить цикл и иметь возможность щелкнуть кнопку и изменить переменную в цикле. Например:

from tkinter import *
import time

root = Tk()
x = 0

def changeVariable():
    x = x + 5

button1 = Button(root, text = "add 5", command=changeVariable)
button1.pack()

while True:
    root.mainloop()
    while x > 0:
        print("X is greater than 0")
        x = x - 1
        time.sleep(1)
    else:
        print("Please click the button")
        time.sleep(1)

Я пробовал всевозможные вещи, и я не могу заставить кнопку изменить значение X в моем цикле while. Может кто-нибудь объяснить, как это сделать, или дать ссылку на видео/руководство, которое хорошо объясняет это новичку?

Спасибо

Вы определенно не хотите вызывать mainloop в цикле. Он должен быть вызван ровно один раз.

Bryan Oakley 28.05.2019 21:59

Когда/где мне вызвать? Кажется, я не могу получить окно, пока работает цикл while. Я могу либо вызвать окно (которое выдаст мне ошибку x is undefined при нажатии), либо цикл while, который просто всегда говорит нажать кнопку. Я пытаюсь понять, как заставить их работать вместе....

Lzypenguin 28.05.2019 22:00
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете поместить код после mainloop. Вам не нужен root.mainloop, так как в вашем коде уже есть вечный цикл. Вы можете просто удалить root.mainloop, и ваш код должен работать.

Изменить. Другая проблема заключается в том, что x не определен глобально. В начале функции changeVariable добавьте код global x.

Последняя проблема заключается в том, что вы используете time.sleep(). Вы не хотите использовать time.sleep, так как кнопку можно нажать, пока все заморожено. См. редактирование 2 для исправления.

Редактировать 2:

Вы можете использовать метод tkinter after. Метод after можно применить к любому объекту tkinter. В этом случае мы применим его к root. Это основной синтаксис: root.after(milliseconds, function_to_execute_after_wait). Функция для выполнения не является обязательной. В вашем случае вместо time.sleep(1) следует использовать root.after(1000). Не забудьте добавить root.update() после root.after(1000).

Вы также можете использовать += или -= для изменения переменных. Вместо x = x + 5 можно использовать x += 5. Вместо x = x - 1 можно использовать x -= 1.

Окончательный код:

from tkinter import *

root = Tk()
x = 0

def changeVariable():
    global x
    x += 5

button1 = Button(root, text = "add 5", command=changeVariable)
button1.pack()

while True:
    while x > 0:
        print("X is greater than 0")
        x -= 1
        root.after(1000)
        root.update()
    else:
        print("Please click the button")
        root.after(1000)
        root.update()

Когда я удаляю root.mainloop(), окно tkinter с кнопкой не появляется. Когда у меня появляется root.mainloop, и я нажимаю на него, он говорит мне, что x не определен, и он не может его изменить.

Lzypenguin 28.05.2019 21:45

Кроме того, мой цикл while не начинает печатать сообщения, пока я не выйду из него. Я хочу, чтобы они работали вместе, а не по отдельности...

Lzypenguin 28.05.2019 21:47

@Lzypenguin Теперь все должно быть исправлено, смотрите мои правки.

CME1 Crewmember 29.05.2019 01:58

После ваших обновлений это сработало!! Большое спасибо! Так что теперь у меня проблемы с этой работой в моем реальном сценарии. Мне приходится многократно нажимать кнопку снова и снова, пока она не щелкнет в нужное время. Я думаю, это потому, что я использую time.sleep(). Что бы вы порекомендовали лучше, чем time.sleep()?

Lzypenguin 29.05.2019 06:55

@Lzypenguin Я написал окончательный код в своем ответе, чтобы вы могли увидеть, как он должен выглядеть в конце.

CME1 Crewmember 29.05.2019 21:58

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