Python Tkinter Grid Checkbox(Python Tkinter 网格复选框)
问题描述
我想知道是否有一种简单的方法可以使用 Tkinter 创建复选框网格.我正在尝试制作一个 10 行和列的网格(所以 100 个复选框),以便每行只能选择两个复选框.
I was wondering if there is an easy way to create a grid of checkboxes using Tkinter. I am trying to make a grid of 10 rows and columns (so 100 checkboxes) so that only two checkboxes can be selected per row.
我正在使用带有 spyder 的 python 2.7
I'm using python 2.7 with spyder
到目前为止我所拥有的:
What I have so far:
from Tkinter import*
master = Tk()
master.title("Select Groups")
rows=10
columns=10
for x in range(rows):
for y in range(columns):
Label(master, text= "Group %s"%(y+1)).grid(row=0,column=y+1)
Label(master, text= "Test %s"%(x+1)).grid(row=x+1,column=0)
Checkbutton(master).grid(row=x+1, column=y+1)
mainloop()
一旦选中了两个复选框,我正在尝试使用 state='Disabled' 来灰显一行.
I'm trying to use state='Disabled' to grey out a row once two checkboxes have been selected.
推荐答案
这是一个使用您提供的 10x10 网格的示例.它应该为您提供有关如何实现此功能的基本概念.
Here's an example using your provided 10x10 grid. It should give you the basic idea of how to implement this.
只需确保您保留对每个 Checkbutton
(示例中为 boxes
)以及每个 IntVar
(boxVars
在示例中).
Just make sure you keep a reference to every Checkbutton
(boxes
in the example) as well as every IntVar
(boxVars
in the example).
原因如下:
-Checkbuttons
需要调用 config(state = DISABLED/NORMAL)
.
-IntVars
来确定每个 Checkbutton
的值.
-IntVars
are needed to determine the value of each Checkbutton
.
除了这些关键元素之外,它基本上只是一些二维数组处理.
Aside from those crucial elements its basically just some 2D array processing.
这是我的示例代码(现在基于您提供的代码).
Here's my example code (now based off of your provided code).
from Tkinter import *
master = Tk()
master.title("Select Groups")
rows=10
columns=10
boxes = []
boxVars = []
# Create all IntVars, set to 0
for i in range(rows):
boxVars.append([])
for j in range(columns):
boxVars[i].append(IntVar())
boxVars[i][j].set(0)
def checkRow(i):
global boxVars, boxes
row = boxVars[i]
deselected = []
# Loop through row that was changed, check which items were not selected
# (so that we know which indeces to disable in the event that 2 have been selected)
for j in range(len(row)):
if row[j].get() == 0:
deselected.append(j)
# Check if enough buttons have been selected. If so, disable the deselected indeces,
# Otherwise set all of them to active (in case we have previously disabled them).
if len(deselected) == (len(row) - 2):
for j in deselected:
boxes[i][j].config(state = DISABLED)
else:
for item in boxes[i]:
item.config(state = NORMAL)
def getSelected():
selected = {}
for i in range(len(boxVars)):
temp = []
for j in range(len(boxVars[i])):
if boxVars[i][j].get() == 1:
temp.append(j + 1)
if len(temp) > 1:
selected[i + 1] = temp
print selected
for x in range(rows):
boxes.append([])
for y in range(columns):
Label(master, text= "Group %s"%(y+1)).grid(row=0,column=y+1)
Label(master, text= "Test %s"%(x+1)).grid(row=x+1,column=0)
boxes[x].append(Checkbutton(master, variable = boxVars[x][y], command = lambda x = x: checkRow(x)))
boxes[x][y].grid(row=x+1, column=y+1)
b = Button(master, text = "Get", command = getSelected, width = 10)
b.grid(row = 12, column = 11)
mainloop()
这篇关于Python Tkinter 网格复选框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Python Tkinter 网格复选框
基础教程推荐
- 筛选NumPy数组 2022-01-01
- 何时使用 os.name、sys.platform 或 platform.system? 2022-01-01
- Dask.array.套用_沿_轴:由于额外的元素([1]),使用dask.array的每一行作为另一个函数的输入失败 2022-01-01
- 使用PyInstaller后在Windows中打开可执行文件时出错 2022-01-01
- 如何让 python 脚本监听来自另一个脚本的输入 2022-01-01
- 在 Python 中,如果我在一个“with"中返回.块,文件还会关闭吗? 2022-01-01
- 如何在海运重新绘制中自定义标题和y标签 2022-01-01
- 线程时出现 msgbox 错误,GUI 块 2022-01-01
- 用于分类数据的跳跃记号标签 2022-01-01
- Python kivy 入口点 inflateRest2 无法定位 libpng16-16.dll 2022-01-01