tkinter 当鼠标悬停在其上时,所有单选按钮都会被选中



我在 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()

这是一个有趣的问题,花了一段时间来调试.
基本上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 ...

还为StringVar设置value=0

list_of_months_variable = StringVar(value=0)

这样就不会预先选择任何Radiobutton


我也建议这样做:
我强烈建议在导入某些内容时不要使用通配符(*),您应该导入您需要的内容,例如from module import Class1, func_1, var_2等等或导入整个模块:import module然后你也可以使用别名:import module as md或类似的东西,关键是不要导入所有内容,除非你真的知道你在做什么;名称冲突是问题所在。

我强烈建议遵循PEP 8 - Python Code风格指南。函数和变量名应为snake_case,类名应为CapitalCase。如果它用作关键字参数的一部分(func(arg='value')),则=周围没有空格,但如果用于分配值(variable = 'some value'),则=周围有空格。在运算符周围留出空间(+-/等:value = x + y(除了这里value += x + y))。在函数和类声明周围有两个空行。

最新更新