当鼠标悬停在 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 声明周围有两个空行。
我在 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 声明周围有两个空行。