Я бы начал с этой простой базы:
import tkinter as tk
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.title("Python Password Generator")
self.geometry("320x240")
self.resizable(width=False, height=False)
def main():
application = Application()
application.mainloop()
return 0
if __name__ == "__main__":
import sys
sys.exit(main())
![](https://i.stack.imgur.com/yl5Jm.png)
Окно tkinter, размер которого нельзя изменить. Ницца. Кроме того, наличие основной функции помогает понять ход программы.
Затем добавьте остальные. Обратите внимание, что я переместил IntVars и StringVars в тело init , а также в сами элементы GUI tkinter. Я также удостоверился, что родитель каждого элемента был или Frame (чтобы держать элементы организованными) или сам экземпляр Application. Что касается генерации пароля, я бы не использовал random.randint или random.sample (поскольку random.sample должен захватывать уникальные элементы до тех пор, пока их не останется, что означает, что вы не сможете генерировать пароли произвольной длины).
import tkinter as tk
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.title("Python Password Generator")
self.geometry("320x240")
self.resizable(width=False, height=False)
self.var_lower = tk.IntVar()
self.var_upper = tk.IntVar()
self.var_symbols = tk.IntVar()
self.var_digits = tk.IntVar()
self.var_password_length = tk.StringVar()
frame = tk.Frame(self)
frame.pack()
check_lower = tk.Checkbutton(
frame,
text="Use lowercase letters (a-z)",
variable=self.var_lower)
check_lower.pack(side=tk.TOP, anchor=tk.W)
check_upper = tk.Checkbutton(
frame,
text="Use uppercase letters (A-Z)",
variable=self.var_upper)
check_upper.pack(side=tk.TOP, anchor=tk.W)
check_symbols = tk.Checkbutton(
frame,
text="Use symbols (e.g. !@#$%)",
variable=self.var_symbols)
check_symbols.pack(side=tk.TOP, anchor=tk.W)
check_digits = tk.Checkbutton(
frame,
text="Use digits (0-9)",
variable=self.var_digits)
check_digits.pack(side=tk.TOP, anchor=tk.W)
entry_frame = tk.Frame(self)
entry_frame.pack()
label = tk.Label(
entry_frame,
text="Password length:")
label.pack(side=tk.TOP, anchor=tk.W)
entry = tk.Entry(
entry_frame,
textvariable=self.var_password_length,
width=16)
entry.pack(side=tk.TOP, anchor=tk.W)
button = tk.Button(
entry_frame,
text="Generate password",
command=self.generate_password)
button.pack(side=tk.TOP, anchor=tk.W, pady=(10, 10))
self.password_entry = tk.Entry(
self,
width=32)
self.password_entry.configure(state="readonly")
self.password_entry.pack()
def generate_password(self):
from random import choices
from string import ascii_lowercase, ascii_uppercase, digits
try:
password_length = int(self.var_password_length.get())
except ValueError:
return
variables = [
self.var_lower,
self.var_upper,
self.var_symbols,
self.var_digits]
character_sets = [
ascii_lowercase,
ascii_uppercase,
"!@#$%^&*",
digits]
character_selection = "".join([charset for var, charset in zip(variables, character_sets) if var.get()])
if not character_selection:
return
password = "".join(choices(character_selection, k=password_length))
self.password_entry.configure(state="normal")
self.password_entry.delete(0, tk.END)
self.password_entry.insert(0, password)
self.password_entry.configure(state="readonly")
def main():
application = Application()
application.mainloop()
return 0
if __name__ == "__main__":
import sys
sys.exit(main())
![](https://i.stack.imgur.com/03QhR.png)