我在 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
))。在函数和类声明周围有两个空行。