Python: событие команды Button вызывается перед любым - PullRequest
0 голосов
/ 21 мая 2019

Я прочитал Почему параметр Button «command» выполняется при объявлении? , и решение, предоставленное Брайаном Окли, выглядит полезным, но в моем случае мне нужно что-то другое (или, возможно, я ошибаюсь),Так как мне нужно передать параметры в классе MainFrame.

Мой код:

views / login.py

import tkinter as tk

from AgileBooks.controllers.login import submit_login

global_font = 'Helvetica'
global_bg = 'gray25'
global_fg = 'lawn green'


class MainFrame():
    # Frame:
    frm_login = tk.Tk()
    frm_login.title('Login | AgileBooks - Copyright Gonzalo Dambra')
    frm_login.geometry('400x300')
    frm_login.configure(background=global_bg)
    # Labels:
    lbl_username = tk.Label(frm_login, text='Username', bg=global_bg, fg=global_fg, font=(global_font, 16))
    lbl_username.place(x=150, y=50)
    lbl_password = tk.Label(frm_login, text='Password', bg=global_bg, fg=global_fg, font=(global_font, 16))
    lbl_password.place(x=150, y=125)
    # Inputtexts:
    txt_username = tk.Entry(frm_login, font=(global_font, 14))
    txt_username.focus()
    txt_username.place(x=100, y=80, height=25, width=200)
    txt_password = tk.Entry(frm_login, show='*',font=(global_font, 14))
    txt_password.place(x=100, y=155, height=25, width=200)
    # Button:
    btn_login = tk.Button(frm_login, text='Login', font=(global_font, 16), bg=global_bg, fg=global_fg,
                          command=submit_login(txt_username.get(), txt_password.get()))
    btn_login.place(x=165, y=200, height=25)


def main():
    frame = MainFrame()
    frame.frm_login.mainloop()


if __name__ == '__main__':
    main()

controllers / login.py:

def submit_login(username, password):
    if len(username) > 0 and len(password) > 0:
        print('Username: ', username, ' | Password: ', password)
    else:
        print('One of the fields is not filled.')

Моя проблема в том, что метод submit_login вызывается без какого-либо события щелчка, он вызывается только при выполнении кода.Что я делаю не так?

1 Ответ

1 голос
/ 21 мая 2019

Вы звоните submit_login, когда привязываете его к кнопке:

command=submit_login(txt_username.get(), txt_password.get())

Вместо этого в Tkinter вы можете привязать команду к лямбде:

command=lambda username=txt_username.get(), password=txt_password.get(): submit_login(username, password)

YouВозможно, вам также захочется перевести ваш вызов на .get(), чтобы это происходило в момент нажатия:

btn_login = tk.Button(frm_login, text='Login', font=(global_font, 16), bg=global_bg, fg=global_fg,    
                      command=lambda username=txt_username, password=txt_password: submit_login(username, password)


def submit_login(username, password):
    username = username.get()
    password = password.get()
    if len(username) > 0 and len(password) > 0:
        print('Username: ', username, ' | Password: ', password)
    else:
        print('One of the fields is not filled.')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...