Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter-使用循环创建多个复选框_Python_Tkinter - Fatal编程技术网

Python Tkinter-使用循环创建多个复选框

Python Tkinter-使用循环创建多个复选框,python,tkinter,Python,Tkinter,我正在尝试创建一个程序,允许用户选择任意数量的复选框并点击按钮从这些复选框返回随机结果。因为我的名单是根据Smash bros ultimate的花名册编制的,所以我尽量避免创建70多个变量来设置复选框。然而,我不知道如何迭代。为行设置的各种值只是占位符,直到我能弄清楚这一点。我还希望在顶部有一个重置按钮,允许用户自动取消选中每个框。到目前为止,这是我的代码。任何帮助都将不胜感激 #!/usr/bin/python3 from tkinter import * window = Tk() #

我正在尝试创建一个程序,允许用户选择任意数量的复选框并点击按钮从这些复选框返回随机结果。因为我的名单是根据Smash bros ultimate的花名册编制的,所以我尽量避免创建70多个变量来设置复选框。然而,我不知道如何迭代。为行设置的各种值只是占位符,直到我能弄清楚这一点。我还希望在顶部有一个重置按钮,允许用户自动取消选中每个框。到目前为止,这是我的代码。任何帮助都将不胜感激

#!/usr/bin/python3

from tkinter import *
window = Tk()

#window name and header
window.title("Custom Random SSBU")
lbl = Label(window, text="Select the fighters you would like to include:")
lbl.grid(column=1, row=0)

f = [] #check boxes

ft = open("Fighters.txt").readlines() #list of all the character names

fv=[0]*78 #list for tracking what boxes are checked

ff=[] #list to place final character strings

def  reset():
   for i in fv:
       fv[i]=0

rst = Button(window, text="Reset", command=reset)
rst.grid(column=0, row=3)

for y in range (0,77):
    f[y] = Checkbutton(window, text = ft[y], variable = fv[y])
    f[y].grid(column=0, row=4+y)

def done():
    for j in fv:
        if fv[j] == 1:
            ff.append(fv[j])
    result = random.choice(ff)
    r=Label(window, text=result)

d = Button(window, text="Done", command=done)
d.grid(column=0, row = 80)

window.mainloop()
这将在创建Checkbutton时查找
fv[y]
-的值,即整数
0
,并将其用于
变量
参数

您需要使用其中一个的实例。在这种情况下,我们需要
BooleanVar
,因为我们正在跟踪布尔状态。我们仍然可以提前在列表中创建这些:

text = open("Fighters.txt").readlines()
# Let's not hard-code the number of lines - we'll find it out automatically,
# and just make one for each line.
trackers = [BooleanVar() for line in text]
# And we'll iterate over those pair-wise to make the buttons:
buttons = [
    Checkbutton(window, text = line, variable = tracker)
    for line, tracker in zip(text, trackers)
]
(但我们不能这样做,例如,
trackers=[BooleanVar()]*len(text)
,因为这给了我们78次相同的跟踪器,因此每个复选框都将共享该跟踪器;我们需要分别跟踪每个跟踪器。)

单击复选框时,TKinter将自动更新相应的
BooleanVar()
的内部状态,我们可以使用其
.get()
方法进行检查。此外,当我们为
random.choice
设置选项时,我们希望为按钮选择相应的文本,而不是跟踪器。我们可以再次使用
zip
技巧来实现这一点

因此,我们想要更像:

result_label = Label(window) # create it ahead of time

def done():
    result_label.text = random.choice(
        label
        for label, tracker in zip(text, trackers)
        if tracker.get()
    )

不幸的是,恐怕您必须为每个复选框创建变量

tkinter
具有保存不同类型值的特殊用途,如果在创建诸如
Checkbutton
之类的小部件时指定一个实例作为
变量=
选项,则每当用户更改它时,它将自动设置或重置其值,因此,您的程序所要做的就是通过调用其
get()
方法来检查其当前值

下面是在循环中创建它们(并在
done()
回调函数中使用它们)所需的代码修改示例:

我不确定你想把包含结果的
标签放在哪里,所以我把它放在重置按钮的右边

result_label = Label(window) # create it ahead of time

def done():
    result_label.text = random.choice(
        label
        for label, tracker in zip(text, trackers)
        if tracker.get()
    )
import random
from tkinter import *

window = Tk()

#window name and header
window.title("Custom Random SSBU")

lbl = Label(window, text="Select the fighters you would like to include:")
lbl.grid(column=1, row=0)

with open("Fighters.txt") as fighters:
    ft = fighters.read().splitlines() # List of all the character names.

fv = [BooleanVar(value=False) for _ in ft] # List to track which boxes are checked.

ff = [] # List to place final character strings.

def  reset():
   for var in fv:
       var.set(False)

rst = Button(window, text="Reset", command=reset)
rst.grid(column=0, row=3)

for i, (name, var) in enumerate(zip(ft, fv)):
    chk_btn = Checkbutton(window, text=name, variable=var)
    chk_btn.grid(column=0, row=i+4, sticky=W)

def done():
    global ff
    ff = [name for name, var in zip(ft, fv) if var.get()]  # List of checked names.
    # Randomly select one of them.
    choice.configure(text=random.choice(ff) if ff else "None")

d = Button(window, text="Done", command=done)
d.grid(column=0, row=len(ft)+4)

choice = Label(window, text="None")
choice.grid(column=1, row=3)

window.mainloop()