首页 > 解决方案 > 使用 tkinter 命令按钮的 Python 传递参数

问题描述

我正在创建一个登录系统,用户在其中输入密码和用户名,然后在按下按钮时,它会进入检查密码的功能。

from tkinter import *

def login():
    Usr = Tk()
    Usr.title("Login")
    Usr.geometry("200x150+860+400")
    Usr.configure(bg="grey22")
    usrBox = Label(Usr, text = "Username:", font=( "arial",12, "bold"), fg="white", bg="grey22").place(x=50, y=10)
    passbox = Label(Usr, text = "Password:", font=( "arial",12, "bold"), fg="white", bg="grey22").place(x=50, y=60)
    usrName = StringVar()
    usernameInput = ""
    passwordInput = ""
    PssWord = StringVar()
    usrName = Entry(Usr, textvariable= usernameInput, width=15, bg="lightgrey").place(x=50, y=37)
    PssWord = Entry(Usr, textvariable= passwordInput, width=15, bg="lightgrey").place(x=50, y=87)
    enter = Button(Usr, text = "login", width=11, height = 1, bg="lightgrey", activebackground="grey", font=("arial", 10, "bold"), command = checkPassword: action(usernameInput, passwordInput)).place(x=50, y=110)
    Usr.mainloop()
def checkPassword(usernameInput, passwordInput):
    print(usernameInput, passwordInput)

login()

该操作返回无效语法

标签: pythonpython-3.xtkinter

解决方案


您的代码存在多个问题:

  • 您必须创建一个lambda调用该checkPassword函数。
  • 您创建了一些StringVar,然后将纯字符串传递给 Entry 字段并在回调中使用它们;这些不会用实际值更新,请StringVar改用。
  • 如果这样做x = Widget(...).layout(...),则x不是小部件,而是None,这是所有布局函数(packgridplace等)的结果,但这在这里不是问题,因为无论如何您都不会使用所有这些变量

固定代码(摘录)

usernameInput = StringVar()
passwordInput = StringVar()
Entry(Usr, textvariable=usernameInput, ...).place(x=50, y=37)
Entry(Usr, textvariable=passwordInput, ...).place(x=50, y=87)
Button(Usr, text="login", ..., command=lambda: checkPassword(usernameInput, passwordInput)).place(x=50, y=110)

然后,在checkPassword函数中,使用StringVar.get()来获取实际值。


推荐阅读