Я не знаю, что не так с моими кодами? Это не обозначает, что я ожидаю - PullRequest
0 голосов
/ 15 июня 2019

Так что, в принципе, я понятия не имею, в чем проблема этого кода. Я пытаюсь выполнить домашнее задание для класса. Я сделал кодирование на своем инструменте, который генерирует пароль в соответствии с флажками, отмеченными пользователем, и записью, которую пишет пользователь. Когда я запускаю это, никаких обратных трассировок с этим нет, но когда я устанавливаю флажки и печатаю в поле ввода, а затем нажимаю кнопку «Генерировать», пароль не размечается. Кроме того, я не мог разметить поле ввода. Так, пожалуйста, вы, ребята, можете помочь мне с тем, что не так с моими кодами? Постскриптум Мой код немного ниже, но я надеюсь, что вы, эксперты, поймете. Вы, ребята, можете скопировать и вставить это на IDLE и запустить его, чтобы увидеть.

import random
import sys
import string
from tkinter import *
# Start Window
class Window(Tk):
    def __init__(self, parent):
        Tk.__init__(self, parent)
        self.parent = parent
        self.initialize()
    def initialize(self):
        self.geometry("1200x500+130+200")

    def OnButtonClick(classGUIProgram):
        classGUIProgram.top = Toplevel()
        master = Tk()
        b = classGUIProgram.HappyButton(master)
        master.mainloop()

if __name__ == "__main__":
    window = Window(None)

window.title("Python Password Generator")
#window end

#title
w = Label(text="Secure Password Generator") 
w.pack()

w.config(font=("Courier", 70))
#title end

#value
rnum = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
rsl = list(string.ascii_lowercase[0:26])
rbl = list(string.ascii_uppercase[0:26])
rs = ['!', '@', '#', '$', '%', '^', '&', '*']
#value end

#label the password
def gpass():
    mtext = v.get()
    password = Label(text=mtext).pack()
    return
#label password end

#Checkbuttons
#checkbutton1
var1 = IntVar()
w1 = Checkbutton(text="Use Small Letters     e.g. abcde", 
variable=var1)
w1.pack()

#checkbutton2
var2 = IntVar()
w2 = Checkbutton(text="Use Big Letters        e.g. ABCDE", 
variable=var2)
w2.pack()

#checkbutton3
var3 = IntVar()
w3 = Checkbutton(text="Use Symbols            e.g. !@#$%", 
variable=var3)
w3.pack()

#checkbutton4
var4 = IntVar()
w4 = Checkbutton(text="Use Numbers          e.g. 12345", 
variable=var4)
w4.pack()
#checkbuttons end

length = StringVar()
var = StringVar()
v = StringVar()

#title label
l = Label(text="Type the password length you want below:")
l.pack()

t = Entry(textvariable=length).pack()
#title lable end

#button
button = Button(text = "Click To Generate Your Password", command = 
gpass, fg = 'Red').pack()
#button end

#generate random value according to the checkbuttons
def getin():
    a = []
    if w1.config(state=NORMAL):
         a.append(rsl[random.randint(*26/1)])
    elif w2.config(state=NORMAL):
        a.append(rbl[random.randint(*26/1)])
    elif w3.config(state=NORMAL):
        a.append(rs[random.randint(*8/1)])
    elif w4.config(state=NORMAL):
        a.append(rnum[random.randint(*9/1)])
    v = random.choices(getin(var(a)), k=str(length))
#generate value end


window.mainloop()

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

Я бы начал с этой простой базы:

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())

Окно 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())

0 голосов
/ 15 июня 2019

Перед тем, как начать, я должен указать, что не используйте tkinter, поэтому, если я сделаю какие-либо ошибки, извините.
Я понятия не имею, что вы пытаетесь сделать с использованием random.
Я предлагаю вместо того, что бы это ни было, используйте random.sample(list, number_required).
Я также предлагаю использовать RadioButton вместо CheckButton, так как это обеспечит выбор только одной опции (я не сделал этого ниже).
Обратный вызов вашей кнопки «Создать» был установлен на gpass без усилий для вызова getin, который фактически генерирует пароль.
Надеемся, что приведенный ниже код укажет вам правильное направление.

import random
import sys
import string
from tkinter import *
# Start Window
class Window(Tk):
    def __init__(self, parent):
        Tk.__init__(self, parent)
        self.parent = parent
        self.initialize()
    def initialize(self):
        self.geometry("1200x500+130+200")

    def OnButtonClick(classGUIProgram):
        classGUIProgram.top = Toplevel()
        master = Tk()
        b = classGUIProgram.HappyButton(master)
        master.mainloop()

if __name__ == "__main__":
    window = Window(None)

window.title("Python Password Generator")
#window end

#title
w = Label(text="Secure Password Generator")
w.pack()

w.config(font=("Courier", 20))
#title end

#value
rnum = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
rsl = list(string.ascii_lowercase[0:26])
rbl = list(string.ascii_uppercase[0:26])
rs = ['!', '@', '#', '$', '%', '^', '&', '*']
passW = "None"
#value end

#generate random value according to the checkbuttons
def getin():
    try:
        l = int(length.get())
    except:
        l = 0
    if var1.get():
        passW = random.choices(rsl,k=l)
    elif var2.get():
        passW = random.choices(rbl,k=l)
    elif var3.get():
        passW = random.choices(rs,k=l)
    elif var4.get():
        passW = random.choices(rnum,k=l)
    password.configure(text=passW)
#generate value end

#Checkbuttons
#checkbutton1
var1 = IntVar()
w1 = Checkbutton(text="Use Small Letters     e.g. abcde",
variable=var1)
w1.pack()

#checkbutton2
var2 = IntVar()
w2 = Checkbutton(text="Use Big Letters        e.g. ABCDE",
variable=var2)
w2.pack()

#checkbutton3
var3 = IntVar()
w3 = Checkbutton(text="Use Symbols            e.g. !@#$%",
variable=var3)
w3.pack()

#checkbutton4
var4 = IntVar()
w4 = Checkbutton(text="Use Numbers          e.g. 12345",
variable=var4)
w4.pack()
#checkbuttons end

length = StringVar()
var = StringVar()
v = StringVar()

#title label
l = Label(text="Type the password length you want below:")
l.pack()

t = Entry(textvariable=length).pack()
#title lable end

#button
button = Button(text = "Click To Generate Your Password", command =
getin, fg = 'Red').pack()
#button end
password = Label(text=passW)
password.pack()

window.mainloop()

enter image description here

Попробуйте заменить CheckButtons на RadioButtons

Отредактировано, чтобы включить использование random.choices, как указано @ user10987432, гораздо лучший «выбор», чем sample, и обновить метку пароля на месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...