Я новичок в кодировании и пытаюсь понять это, и я не могу, и я не могу найти видео на 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. Может кто-нибудь объяснить, как это сделать, или дать ссылку на видео/руководство, которое хорошо объясняет это новичку?
Спасибо
Когда/где мне вызвать? Кажется, я не могу получить окно, пока работает цикл while. Я могу либо вызвать окно (которое выдаст мне ошибку x is undefined при нажатии), либо цикл while, который просто всегда говорит нажать кнопку. Я пытаюсь понять, как заставить их работать вместе....
Вы не можете поместить код после 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 не определен, и он не может его изменить.
Кроме того, мой цикл while не начинает печатать сообщения, пока я не выйду из него. Я хочу, чтобы они работали вместе, а не по отдельности...
@Lzypenguin Теперь все должно быть исправлено, смотрите мои правки.
После ваших обновлений это сработало!! Большое спасибо! Так что теперь у меня проблемы с этой работой в моем реальном сценарии. Мне приходится многократно нажимать кнопку снова и снова, пока она не щелкнет в нужное время. Я думаю, это потому, что я использую time.sleep(). Что бы вы порекомендовали лучше, чем time.sleep()?
@Lzypenguin Я написал окончательный код в своем ответе, чтобы вы могли увидеть, как он должен выглядеть в конце.
Вы определенно не хотите вызывать
mainloop
в цикле. Он должен быть вызван ровно один раз.