Python-Tkinter-无法禁用单个单选按钮



我无法禁用tkinter-gui中的单个单选按钮。我只能禁用最后创建的一组按钮,原因是我用来存储按钮句柄的矩阵没有正确存储或返回。它只返回最后创建的按钮的句柄。

这是要测试的代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun May  9 10:02:18 2021
@author: stefaniecg
"""
import tkinter as tk
gui = tk.Tk()
gui.title('title of the app')
gui.geometry("400x200") # (X * Y)
# constants
inc_crit = (('item_0',0,'desc0'),('item_1',1,'desc1'),('item_2',2,'desc2'),('item_3',3,'desc3'))
inc_opt = (('true',0,0),('false',1,1),('maybe',2,2))
# display radio buttons
inc_v = [None] * len(inc_crit)
inc_txt = [None] * len(inc_crit)
rad_btn = [[None]*len(inc_opt)] * len(inc_crit)
for i,[name,row,desc] in enumerate(inc_crit):
inc_v[i] = tk.IntVar(); inc_v[i].set(2)
for j,[optn,val,col] in enumerate(inc_opt):
rad_btn[i][j] = tk.Radiobutton(gui,variable=inc_v[i],value=val)
rad_btn[i][j].grid(row=row,column=col)
inc_txt[i] = tk.Text(gui,width=30,height=1,font=(None,13))
inc_txt[i].grid(row=row,column=3) 
inc_txt[i].insert(1.0,desc)
# disable radio buttons
rad_btn[1][2].configure(state='disabled')
rad_btn[2][0].configure(state='disabled')
rad_btn[3][2].configure(state='disabled')
# launch gui
gui.mainloop()

这是单选按钮的手柄的返回。这就是问题所在:它们都将手柄返回到单选按钮10,11,12

In [10]: rad_btn
Out[10]: 
[[<tkinter.Radiobutton object .!radiobutton10>,
<tkinter.Radiobutton object .!radiobutton11>,
<tkinter.Radiobutton object .!radiobutton12>],
[<tkinter.Radiobutton object .!radiobutton10>,
<tkinter.Radiobutton object .!radiobutton11>,
<tkinter.Radiobutton object .!radiobutton12>],
[<tkinter.Radiobutton object .!radiobutton10>,
<tkinter.Radiobutton object .!radiobutton11>,
<tkinter.Radiobutton object .!radiobutton12>],
[<tkinter.Radiobutton object .!radiobutton10>,
<tkinter.Radiobutton object .!radiobutton11>,
<tkinter.Radiobutton object .!radiobutton12>]]

因此,对于我尝试禁用的每个按钮:(下面的代码(总是禁用最后一组创建的单选按钮:即单选按钮11、12、13,因为有手柄。

# disable radio buttons
rad_btn[1][2].configure(state='disabled')
rad_btn[2][0].configure(state='disabled')
rad_btn[3][2].configure(state='disabled')

请帮助:(

这是因为行:

rad_btn = [[None]*len(inc_opt)] * len(inc_crit)

将创建列表列表,其中所有行引用列表的同一实例([None]*len(inc_opt)(。

您需要将其更改为:

rad_btn = [[None]*len(inc_opt) for _ in inc_crit]

它将创建单个列表[None]*len(inc_opt)len(inc_crit)实例。

最新更新