gpt4 book ai didi

Python Tkinter 网格复选框

转载 作者:太空狗 更新时间:2023-10-30 02:43:59 24 4
gpt4 key购买 nike

我想知道是否有一种使用 Tkinter 创建复选框网格的简单方法。我正在尝试制作一个包含 10 行和 10 列的网格(因此有 100 个复选框),以便每行只能选择两个复选框。

编辑:我正在使用 python 2.7 和 spyder

到目前为止我所拥有的:

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' 使一行变灰。

最佳答案

这是一个将所有内容都放入类中的版本,因此我们不需要使用全局变量。它还避免了 import * 构造,这在 Python 中通常被认为是不好的风格。确实,很多示例代码都使用了 import * 但这不是一个好的做法,因为它用导入模块中的所有名称弄乱了全局命名空间。因此,这些名称可能会与您自己的变量名称冲突,也可能会与您使用 import * 导入的其他模块的名称冲突。

程序会在窗口关闭时为每个测试行打印所选组的列表。

#!/usr/bin/env python

''' Create a grid of Tkinter Checkbuttons

Each row permits a maximum of two selected buttons

From http://stackoverflow.com/q/31410640/4014959

Written by PM 2Ring 2015.07.15
'''

import Tkinter as tk

class CheckGrid(object):
''' A grid of Checkbuttons '''
def __init__(self, rows=10, columns=10):
master = tk.Tk()
master.title("Select Groups")

rowrange = range(rows)
colrange = range(columns)

#Create the grid labels
for x in colrange:
w = tk.Label(master, text="Group %s" % (x + 1))
w.grid(row=0, column=x+1)

for y in rowrange:
w = tk.Label(master, text="Test %s" % (y + 1))
w.grid(row=y+1, column=0)

#Create the Checkbuttons & save them for future reference
self.grid = []
for y in rowrange:
row = []
for x in colrange:
b = tk.Checkbutton(master)

#Store the button's position and value as attributes
b.pos = (y, x)
b.var = tk.IntVar()

#Create a callback bound to this button
func = lambda w=b: self.check_cb(w)
b.config(variable=b.var, command=func)
b.grid(row=y+1, column=x+1)
row.append(b)
self.grid.append(row)

#Track the number of on buttons in each row
self.rowstate = rows * [0]

master.mainloop()

def check_cb(self, button):
''' Checkbutton callback '''
state = button.var.get()
y, x = button.pos

#Get the row containing this button
row = self.grid[y]

if state == 1:
self.rowstate[y] += 1
if self.rowstate[y] == 2:
#Disable all currently off buttons in this row
for b in row:
if b.var.get() == 0:
b.config(state=tk.DISABLED)
else:
self.rowstate[y] -= 1
if self.rowstate[y] == 1:
#Enable all currently off buttons in this row
for b in row:
if b.var.get() == 0:
b.config(state=tk.NORMAL)

#print y, x, state, self.rowstate[y]

def get_checked(self):
''' Make a list of the selected Groups in each row'''
data = []
for row in self.grid:
data.append([x + 1 for x, b in enumerate(row) if b.var.get()])
return data


def main():
g = CheckGrid(rows=10, columns=10)

#Print selected Groups in each Test row when the window closes
data = g.get_checked()
for y, row in enumerate(data):
print "Test %2d: %s" % (y + 1, row)


if __name__ == '__main__':
main()

关于Python Tkinter 网格复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31410640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com