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

2024-05-04 00:09:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这是单选按钮的句柄的返回。 这就是问题所在:它们都将句柄返回到radiobutton10,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')

请帮忙:)


1条回答
网友
1楼 · 发布于 2024-05-04 00:09:17

这是因为:

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)实例

相关问题 更多 >