繁体   English   中英

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

[英]Python - Tkinter - unable to disable single radio buttons

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

请帮忙:)

这是因为该行:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM