#python #tkinter #radio-button
Вопрос:
Я использую радиокнопки в tkinter, и я могу их нормально выбирать, но когда мышь наводится на один из вариантов, он выбирается без моего фактического нажатия левой кнопки мыши.
from tkinter import *
p = Tk()
def select_months():
new_window = Toplevel()
new_window.resizable(width=FALSE, height=FALSE)
days_label = Label(new_window,text="Select month")
days_label.grid()
ycolumn = 0
xrow = 1
list_of_months = ["January", "February ", "March ", "April "]
list_of_months_variable = StringVar()
# list_of_months_variable.set(None)
for i in list_of_months:
Radiobutton(new_window, text=i, variable=list_of_months_variable, value=str(i)).grid(padx=4, row=xrow, column=ycolumn)
ycolumn = 1
if ycolumn > 2:
ycolumn = 0
xrow = 1
ok_button = Button(new_window, text="OK", command=new_window.destroy).grid()
select_month_label = Label(p,text="which month ? : ").pack(side="left")
select_month_button = Button(p, text="months...", command=select_months).pack()
p.mainloop()
Ответ №1:
Это забавная проблема, потребовалось некоторое время для отладки.
В основном select_months()
функция завершается. Но появляется окно со всеми размещенными кнопками, поэтому труднее понять, что функция завершена. Что происходит, когда функция завершается? Все локальные переменные функции собирают мусор. Это означает, что ссылка на list_of_months_variable
тоже потеряна. Это вызывает некоторые проблемы с виджетами, не могу точно сказать, почему это происходит (выберите при наведении), но решение довольно простое.
global list_of_months_variable
Добавьте это в свою select_months()
функцию где-нибудь перед определением переменной (обычно в верхней части определения функции).:
def select_months():
global list_of_months_variable
new_window = Toplevel()
# the rest of the code ...
Также установлен value=0
для StringVar
:
list_of_months_variable = StringVar(value=0)
так что ни один из Radiobutton
s не выбран заранее.
Я также хотел бы предложить вот что:
я настоятельно не рекомендуем использовать подстановочный знак ( *
) при импорте что-то, вы должны либо импортировать то, что вам нужно, например, from module import Class1, func_1, var_2
и так далее, либо импортировать весь модуль: import module
вы также можете использовать псевдоним: import module as md
или sth, как это, дело в том, что не все импортное, если вы на самом деле знаете, что Вы делаете; наименование столкновения эту проблему.
Я настоятельно рекомендую следовать руководству по стилю PEP 8 для кода на Python. Имена функций и переменных должны быть в snake_case
, имена классов в CapitalCase
. Не используйте пробел, =
если он используется как часть аргумента ключевого слова ( func(arg='value')
), но используйте пробел, =
если он используется для присвоения значения ( variable = 'some value'
). Есть пространство вокруг операторов ( -/
и т.д.: value = x y
(кроме здесь value = x y
)). Есть две пустые строки вокруг объявлений функций и классов.