Как связать выбор нескольких Checkbutton с выполнением основного кода?

Написал простой генератор паролей. Использую флажки Checkbutton для выбора конкретных символов используемых в генерировании пароля. Выбор нескольких наборов символов для пароля организовал через if.

Подскажите, можно ли упростить код и сделать выбор наборов не через if, ведь Checkbutton может быть не три, а гораздо больше. Буду рад любому совету. Спасибо.

import random
from tkinter import *
from tkinter import messagebox
from tkinter import ttk

def generator():
    if Letters.get() == 1:
        list_pas = 'ABCDEFGHIGKLMNOPQRSTUVYXWZ'
    if Numbers.get() == 1:
        list_pas = '0123456789'
    if Symbols.get() == 1:
        list_pas = '<>=-_!@#$%'
    if Letters.get() == 1 and Numbers.get() == 1:
        list_pas = 'ABCDEFGHIGKLMNOPQRSTUVYXWZ0123456789'
    if Letters.get() == 1 and Symbols.get() == 1:
        list_pas = 'ABCDEFGHIGKLMNOPQRSTUVYXWZ<>=-_!@#$%'
    if Numbers.get() == 1 and Symbols.get() == 1:
        list_pas = '0123456789<>=-_!@#$%'
    if Letters.get() == 1 and Numbers.get() == 1 and Symbols.get() == 1:
        list_pas = 'ABCDEFGHIGKLMNOPQRSTUVYXWZ0123456789<>=-_!@#$%'
    try:
        Entry_Long_Pass = Entry_Data.get()
        Entry_Long_Pass = int(Entry_Long_Pass)
        if Entry_Long_Pass < 0:
            messagebox.showwarning('ВНИМАНИЕ', 'ДЛИНА ПАРОЛЯ МЕНЬШЕ 0')
        else:
            pas = ''
            for i in range(Entry_Long_Pass): 
                pas = pas + random.choice(list(list_pas))
            TextWorld.delete(1.0,END)
            TextWorld.insert(END, pas)
    except ValueError:
        messagebox.showerror('ВНИМАНИЕ', 'ПРОВЕРЬ ДЛИНУ ПАРОЛЯ')
    except:
        messagebox.showerror('ВНИМАНИЕ', 'ВЫБЕРИ СИМВОЛЫ ДЛЯ ПАРОЛЯ')
        
root = Tk()
root.title('ГЕНЕРАТОР ПАРОЛЕЙ')
Label(root, text='ДЛИНА ПАРОЛЯ:', font='Arial 11').grid(row=0, column=0)
Entry_Data = Entry(root, width=10, font='Arial 11')
Entry_Data.grid(row=0, column=1)

Letters = IntVar()
Letters_checkbutton = ttk.Checkbutton(text='A...Z', variable=Letters)
Letters_checkbutton.grid(row=0, column=2)
 
Numbers = IntVar()
Numbers_checkbutton = ttk.Checkbutton(text='0...9', variable=Numbers)
Numbers_checkbutton.grid(row=0, column=3)
 
Symbols = IntVar()
Symbols_checkbutton = ttk.Checkbutton(text='!...%', variable=Symbols)
Symbols_checkbutton.grid(row=0, column=4)

Button_pas = Button(root,text='ГЕНЕРАТОР',  font=('Arial', 10), bg='#d8e4bc', fg='black', width=10, height=1, command=generator).grid(row=0,   column=5)

TextWorld = Text(root, font='Arial 11', width=55, height=10, fg='white', bg='black')
TextWorld.grid(row=1, column=0, columnspan=6)

root.resizable(width=False, height=False)
root.mainloop()

Ответы (2 шт):

Автор решения: Сергей Кох

Вместо нескольких if, вам просто надо вставить "математическое" выражение со строками

list_pas = 'ABCDEFGHIGKLMNOPQRSTUVYXWZ' * Letters.get() + '0123456789' * Numbers.get() + '<>=-_!@#$%' * Symbols.get()

Тогда в списке будут оставаться только выбранные элементы, так как значения checkbutton равны 0 или 1.

→ Ссылка
Автор решения: insolor

Просто склеивайте нужный набор символов из частей, а не перебирайте все варианты сочетаний чекбоксов, тогда нужно будет всего 3 if-а. Также можно убрать сравнение с 1, т.к. 1 и так эквивалентно истине:

    list_pass = ""
    if Letters.get():
        list_pas += 'ABCDEFGHIGKLMNOPQRSTUVYXWZ'
    if Numbers.get():
        list_pas += '0123456789'
    if Symbols.get():
        list_pas += '<>=-_!@#$%'
→ Ссылка