отключить дополнительную строку кода при нажатии кнопки в tkinter - PullRequest
0 голосов
/ 19 ноября 2018

Я создаю экран входа в систему, я сделал большую часть кода, теперь мне нужно просто иметь возможность отключить вторичное окно, когда кнопка входа в систему завершает успешную функцию.

вот код:

 def log():
    global us_name, log_pass, hash1, profile_logged, log_complete
    us_name = entrylogun.get()
    log_pass = entrylogpa.get()
    hash1 = pbkdf2_sha256.hash(str(log_pass), rounds=1, salt_size=0)
    log_pass = 0
    log_complete = False
    with open("users.txt", "r") as users:
        if (us_name + "" + hash1 + "") in users.read():
            log_complete = True
            profile_logged = open("" + us_name + ".txt", "r+")
        else:
            tkinter.messagebox.showinfo("Verification Error",
                                        "The Password and Username combination \n entered is not valid, please try again")
    return log_complete

после этого у меня есть все настройки моего GUI, затем кнопка входа в систему

register_button = Button(center_frame, padx=7, pady=2, text="Log In", font=("arial", 10), bg="light grey", fg="black", command= (log and ))
register_button.grid(row=17, pady=8)

Теперь я пытаюсь, чтобы после нажатия этой кнопки после успешного завершения всех проверок входа в систему открылось новое окно. Тем не менее, я не могу запустить весь этот код, только когда вход в систему успешен ... я потерян, как я могу. Я уже везде искал и серьезно не могу найти как ...

если я просто начинаю новую строку, зависящую от log_complete, python заставляет меня устанавливать эту переменную с самого начала, и потому что мне нужно определить ее заранее, она запускает ее заранее и так далее.

1 Ответ

0 голосов
/ 19 ноября 2018

Вам понадобится другая функция, которая запускает вашу функцию, которая запускает новое окно тогда и только тогда, когда log() возвращает True.

Существует два способа сделать это: вы можете определить новую именованную функцию или использовать лямбда-выражение.

(я предполагаю, что у вас есть функция launch, которая не требует аргументов и запускает ваше новое окно.)

Определение новой функции

def fred(): # I can't think of a good name right now
    if log():
        launch()

Затем вы можете передать fred в конструктор Button, как и любую другую функцию.

Это довольно многословно для функции, которую вы (вероятно) будете использовать только один раз.

Лямбда-выражения

lambda: launch() if log() else False

Это лямбда-выражение использует условное выражение для оценки launch(), если log() возвращает True и возвращает False в противном случае. (False не имеет значения в этом случае, потому что возвращаемое значение функции Button command нигде не используется. Это только здесь, потому что условным выражениям требуется что-то для оценки, если условие оценивается как False.)

Вы можете передать это лямбда-выражение в конструктор Button, как и любую другую функцию:

register_button = Button(center_frame, padx=7, pady=2, text="Log In", font=("arial", 10), bg="light grey", fg="black", command=lambda: launch() if log() else False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...