Stringvar не меняется с помощью функций
Как описал уже выше Stringvar не меняется. Пробовал уже использовать Toplevel(), тоже не сработало
#Функции, которые должны менять
def choice_clicked_1():
btn_text.set("Русский язык")
def choice_clicked_2():
btn_text.set("Английский язык")
def choice_clicked_3():
btn_text.set("Алгебра")
def choice_clicked_4():
btn_text.set("Геометрия")
#Второстепеное окно
choice = Toplevel(main)
choice.title("Выбор предмета")
choice.geometry("1000x500")
choice.resizable(False, False)
choice.protocol('WM_DELETE_WINDOW', choice_close)
btn1 = Button(choice, text="Русский язык", bg="#F0F8FF", command=choice_clicked_1())
btn1.pack()
btn2 = Button(choice, text="Английский язык", bg="#F0F8FF", command=choice_clicked_2())
btn2.pack()
btn3 = Button(choice, text="Алгебра", bg="#F0F8FF", command=choice_clicked_3())
btn3.pack()
btn4 = Button(choice, text="Геометрия", bg="#F0F8FF", command=choice_clicked_4())
#Главное окно
main = Tk()
main.title("Умное Рассписание: Тест")
main.geometry("1100x650")
main.resizable(False, False)
main.protocol('WM_DELETE_WINDOW', close)
main["bg"] = "#F0F8FF"
btn14 = Button(text="__________________", textvariable=btn_text, command=button_clicked).grid(row=2, column=1, pady=10, padx=10)
#Переменная через которую происходит изменения
global btn_text
btn_text = StringVar(value="Не выбран")
Ответы (2 шт):
Автор решения: Danis
→ Ссылка
global btn_text надо писать в начале каждой функции где эта переменная будет использоваться
def choice_clicked_1():
global btn_text
bn_text.set("Русский язык")
также место
command=choice_clicked_1()
надо писать
command=choice_clicked_1
Автор решения: insolor
→ Ссылка
- При привязке обработчиков нажатия к кнопкам нужно убрать скобки, иначе функции-обработчики выполнятся один раз при запуске программы, в параметр command передастся результат выполнения этих функций (
None), из-за этого при нажатии на кнопки ничего не будет происходить. - У вас переменная ни к какому контролу не привязана, поэтому визуально ничего не меняется, хотя значение переменной будет меняться (если поправить п.1, конечно же).
- Если переменная не перезаписывается, а вызываются методы от объекта в этой переменной, то
globalне нужно.
Ниже пример, где я добавил Label, к которому привязал переменную btn_text. При нажатии на кнопки текст в label меняется меняется:
from tkinter import *
#Главное окно
main = Tk()
main.title("Умное Рассписание:Тест")
main.geometry("1100x650")
main.resizable(False, False)
# main.protocol('WM_DELETE_WINDOW', close)
main["bg"] = "#F0F8FF"
#Переменная через которую происходит изменения
btn_text = StringVar(value="Не выбран")
# Добавлено: метка, к которой привязана переменная,
# в ней будет меняться текст при нажатии на кнопки
Label(main, textvariable=btn_text).pack()
#Функции, которые должны менять
def choice_clicked_1():
btn_text.set("Русский язык")
def choice_clicked_2():
btn_text.set("Английский язык")
def choice_clicked_3():
btn_text.set("Алгебра")
def choice_clicked_4():
btn_text.set("Геометрия")
btn1 = Button(main, text="Русский язык", bg="#F0F8FF", command=choice_clicked_1)
btn1.pack()
btn2 = Button(main, text="Английский язык", bg="#F0F8FF", command=choice_clicked_2)
btn2.pack()
btn3 = Button(main, text="Алгебра", bg="#F0F8FF", command=choice_clicked_3)
btn3.pack()
btn4 = Button(main, text="Геометрия", bg="#F0F8FF", command=choice_clicked_4)
main.mainloop()