我目前正在研究密碼生成器的 v1。我一直在研究視覺元素,現在開始研究實際的密碼生成。我一直在使用 pydroid 3 和 tkinter 在我的 android 設備上對此進行編碼。
我讓程式有三個復選框,分別代表大寫字母、數字和特殊字符;以及所需密碼長度的輸入欄位。我創建了第一個 if 陳述句,在所有復選框都被選中時執行,但在點擊“生成”按鈕時測驗它會導致“PY_VAR4”結果,每次按下按鈕時 4 都會增加(PY_VAR4、PY_VAR5 等)。
你們對我如何解決這個問題有什么建議嗎?我嘗試使用不同的方法來使用變數或label["text"] = "text" 代碼更改結果標簽的文本,但這似乎并沒有解決問題。我還測驗了密碼長度變數(將其直接插入結果標簽)和勾選框變數,它似乎有效。我得出的結論是它必須在 if 陳述句或生成代碼中,但我無法弄清楚它可能是什么。我不確定此時還有什么要測驗和玩的。
這是代碼:
import tkinter as tk
import random
import string
#randomized password based on ticked boxes
def final(event):
password = tk.StringVar(value="")
password_length = size.get()
if uppercase_on == True and special_chars_on == True and numbers_on == True:
characters = string.ascii_letters string.digits string.punctuation
password = "".join(secret.choice(characters) for i in range(password_length))
result["textvariable"] = password
# start of gui
window = tk.Tk()
# some variables.
no_result = tk.StringVar(value="")
# title
title_text = tk.Label(
text="Aero's Pawsword Generator",
fg="brown",
bg="grey",
height=5
)
# Action prompt text
action_descriptor = tk.Label(
text="Select the appropriate option and tap Generate!",
height=5
)
#size input field text
size_text = tk.Label(text="Size")
size = tk.Entry(
width=3,
fg="grey"
)
# uppercase tick box variable
uppercase_on = tk.BooleanVar(value=False)
upper = tk.Checkbutton(
text="Uppercase Included",
variable=uppercase_on,
onvalue=True,
offvalue=False,
height=3
)
# special characters tick box variable
special_chars_on = tk.BooleanVar(value=False)
special_chars = tk.Checkbutton(
text = "Special Characters Included",
variable=special_chars_on,
onvalue=True,
offvalue=False,
height=3
)
# numbers tick box variable
numbers_on = tk.BooleanVar(value=False)
numbers = tk.Checkbutton(
text="Numbers Included",
variable=numbers_on,
onvalue=True,
offvalue=False,
height=3
)
# generate button
generate = tk.Button(
text="Generate",
width=5,
height=2,
bg="grey",
fg="brown"
)
# results label, empty until something has been generated
result = tk.Label(
textvariable=no_result,
height=5
)
# pack all elements
title_text.pack(fill=tk.X)
action_descriptor.pack(fill=tk.X)
size_text.pack(fill=tk.X)
size.pack()
upper.pack()
special_chars.pack()
numbers.pack()
generate.pack()
result.pack(fill=tk.X)
generate.bind("<Button-1>", final)
window.mainloop()
uj5u.com熱心網友回復:
你的 final() 確實有問題。這是一個有效的版本:
#randomized password based on ticked boxes
def final(event):
password = "" # tk.StringVar(value="")
password_length = size.get()
password_length = int(password_length) if password_length else 8
characters = string.ascii_lowercase
if uppercase_on.get():
characters = string.ascii_uppercase
if special_chars_on.get():
characters = string.punctuation
if numbers_on.get():
characters = string.digits
password = "".join(random.choice(characters) for i in range(password_length))
no_result.set(password)
# result["textvariable"] = password
需要注意的一些變化:
您正在更改
password函式中的型別。您將其作為 StringVar 開始,然后將其更改為if. 將同一個變數用于多個目的時要小心。它使代碼更難跟蹤和除錯。它會導致錯誤。您的 if 總是很滿意,因為您必須使用 .get() 方法訪問 StringVar(或其他 Tkinter 變數)的值。否則,您將獲得實際的 Tkinter 變數,Python 將其視為邏輯 True。
您需要將密碼的不同組成部分分開。所以,我假設默認密碼是 8 個字符,全部小寫。然后,您可以使用復選框和條目小部件(用于密碼長度)覆寫它。
uj5u.com熱心網友回復:
你錯過了一些......
def final():
password = tk.StringVar(value="")
password_length = size.get()
if uppercase_on.get() == True and special_chars_on.get() == True and numbers_on.get() == True:
characters = string.ascii_letters string.digits string.punctuation
for i in range(int(password_length)) :
password.set(str(password.get()) random.choice(characters))
no_result.set(str(password.get()))
和
# generate button
generate = tk.Button(
text="Generate",
width=5,
height=2,
bg="grey",
fg="brown",
command=final
)
最后洗掉系結
upper.pack()
special_chars.pack()
numbers.pack()
generate.pack()
result.pack()
window.mainloop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/370481.html
下一篇:背景視窗和主視窗tkinter
