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

tkinter all radiobuttons get selected when the mouse hovers over it

我在 tkinter 中使用 Radiobuttons,我可以 select 它们很好,但是当鼠标悬停在其中一个选项上时,它会 selected 而我实际上没有点击鼠标左键.

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() 函数完成。但是 window 与所有放置的按钮一起出现,因此很难理解该功能已完成。函数完成时会发生什么?函数的所有局部变量都会被垃圾回收。这意味着对 list_of_months_variable 的引用也丢失了。这会导致小部件出现一些问题,无法确切说明为什么会发生这种情况(悬停时 select),但解决方案非常简单。

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 中的 none 是预select编辑的。


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

强烈建议关注PEP 8 - Style Guide for Python Code。函数和变量名称应在 snake_case 中,class 中的名称应在 CapitalCase 中。如果用作关键字参数 (func(arg='value')) 的一部分,则不要在 = 周围设置 space,但如果用于 =,则在 = 周围设置 space赋值 (variable = 'some value')。在运算符周围有 space(+-/ 等:value = x + y(此处除外 value += x + y))。在函数和 class 声明周围有两个空行。