К сожалению, я боюсь, что придется создавать переменные для каждого флажка.
tkinter
имеет специальное назначение Классы переменных для хранения различных типовзначений, и если вы указываете экземпляр одного в качестве опции variable=
при создании виджетов, таких как Checkbutton
, он будет автоматически устанавливать или сбрасывать свое значение всякий раз, когда пользователь изменяет его, поэтому все, что ваша программа должна сделать, это проверить еготекущее значение путем вызова его get()
метода.
Вот пример изменений в вашем коде, необходимых для их создания в цикле (и использования их в функции обратного вызова done()
):
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)
f = [] # Check boxes.
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()
Я не был уверен, куда вы хотите, чтобы Label
содержал результат, поэтому я просто поместил его справа от кнопки Сброс .