Как заставить работать if после нажатия на одну из кнопок?
После нажатия на одну из кнопок должен срабатывать if. Ещё планируется, что в if будут вложены другие if. Все if зависят от нажатия на одну из кнопок.
from tkinter import *
root = Tk()
root.geometry('500x500')
arg = 0
def click(arg):
if arg == 1:
return True
elif arg == 2:
return False
lbl = Label(text='Дрова')
btn = Button(text="Yes", command=click(1))
btn1 = Button(text="No", command=click(2))
lbl.pack()
btn.pack()
btn.pack()
if click(arg) == True:
lbl.config(text='Тутуруту')
if click(arg) == True:
lbl.config(text='Следующий вопрос')
if click(arg) == True:
lbl.config(text='И так далее пока блок схема не кончится')
elif click(arg) == False:
lbl.config(text='Тут что-нибудь')
elif click(arg) == False:
lbl.config(text='А вот и нет...')
root.mainloop()
Ответы (1 шт):
Просто через if не получится, т.к. программа с графическим интерфейсом работает не линейно (как в консоли), а управляется событиями (например, нажатиями кнопок, как в данном случае). Поэтому нужно как-то представить весь опрос/викторину в виде графа или дерева, помнить в каком месте графа в данный момент вы находитесь, а нажатия на кнопок будут изменять положение в этом графе. Гуглить по теме: конечные автоматы, машины состояний.
Как я понимаю, возврата по опросу в обратную сторону не предполагается, поэтому его можно представить в виде дерева. Дерево можно составить из простых кортежей, где первый элемент - вопрос, второй элемент - следующий узел/вопрос, если ответ был да, третий элемент - следующий узел/вопрос, если ответ был нет. Для конечных узлов можно использовать просто строки или None.
Простейшее дерево:
(
"Вопрос?",
"Правильно!",
"Неправильно!",
)
Более сложный опрос:
(
"Вопрос?",
(
"Правильно! А если так?",
"Неправильно! Вы проиграли!",
"Правильно! Вы выиграли!"
),
"Неправильно! Вы проиграли!"
)
Для вашего кода получается такое дерево:
(
'Дрова',
(
'Тутуруту',
(
'Следующий вопрос',
'И так далее пока блок схема не кончится',
None
),
'Тут что-нибудь'
),
'А вот и нет...'
)
Дальше код:
from tkinter import *
quiz = (
'Дрова',
(
'Тутуруту',
(
'Следующий вопрос',
'И так далее пока блок схема не кончится',
None
),
'Тут что-нибудь'
),
'А вот и нет...'
)
root = Tk()
root.geometry('500x500')
def end_game():
# Действия, если опрос окончен (тут просто скрываем кнопки)
btn.pack_forget()
btn1.pack_forget()
def show_question():
if position is None: # Если вместо следующего вопроса оказалось None
lbl.config(text="Конец")
end_game()
elif isinstance(position, str): # Если вместо следующего вопроса оказалась строка
lbl.config(text=position)
end_game()
else:
lbl.config(text=position[0])
def click(answer):
# Внутри функции меняем глобальную переменную позиции, поэтому нужно объявить ее как глобальную
global position
# Если "Да", то переход по первой ветке дерева, если "Нет" - то по другой
if answer:
position = position[1]
else:
position = position[2]
show_question()
lbl = Label()
# Тут вызовы функций нужно обернуть в лямбды, иначе функция будет вызываться сразу при старте программы
btn = Button(text="Yes", command=lambda: click(True))
btn1 = Button(text="No", command=lambda: click(False))
lbl.pack()
btn.pack()
btn1.pack()
position = quiz # Устанавливаем начальную позицию на "корень" дерева
show_question() # Показываем первый вопрос
root.mainloop()