Как связать выбор нескольких 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.
Просто склеивайте нужный набор символов из частей, а не перебирайте все варианты сочетаний чекбоксов, тогда нужно будет всего 3 if-а. Также можно убрать сравнение с 1, т.к. 1 и так эквивалентно истине:
list_pass = ""
if Letters.get():
list_pas += 'ABCDEFGHIGKLMNOPQRSTUVYXWZ'
if Numbers.get():
list_pas += '0123456789'
if Symbols.get():
list_pas += '<>=-_!@#$%'