动态创建按钮会导致命令触发

我第一次尝试使用 tkinter 时遇到了麻烦。我需要创建很多按钮,因此为了使代码看起来更简洁一些,我使用了 for 循环和动态变量名称来创建每个按钮。这样做的问题是,当创建每个按钮时,都会为该按钮运行 btnClick(x)。所以我有 PING!1,平安!2,...在我的终端。最重要的是,按钮在创建窗口后没有响应(单击它们没有响应)。


有没有办法使用 for 循环/动态变量并让按钮工作,或者是为每个按钮写出来的唯一方法?


from tkinter import *


window = Tk()

btns = {}

btnNames = ["Description",          "Tags",                     "Display",              "Armor", 

            "Hit Points",           "Damage",                   "Speed",                "Ability Scores", 

            "Saving Throws",        "Skills",                   "Vulnerabilities",      "Resistances", 

            "Immunities (Damage)",  "Immunities (Conditions)",  "Senses",               "Languages", 

            "Traits",               "Actions",                  "Reactions",            "Paragon Actions", 

            "Ledgendary Actions",   "Lair Actions",             "Notes"]


def StartWindow():

    # set Basics

    window.title("Monster Maker")

    window.geometry('900x600')


    # Set Icon

    window.iconbitmap("Sources/Icon.ico")


    MonsterMaker()


    # Run window

    window.mainloop()


def MonsterMaker():

    for x in range(23):

        name = "btn" + str(x)

        btns[name] = Button(window, text=btnNames[x], command=btnClick(x), width=20, height=1)

        btns[name].grid(column=0, row=x)


def btnClick(index):

    print("PING! " + str(index))


if __name__ == "__main__":

    StartWindow()```


慕桂英4014372
浏览 93回答 1
1回答

DIEA

问题是您btnClick在创建按钮时调用该函数,但您想将该函数作为参数传递。而是使用 lambda:btns[name] = Button(window, text=btnNames[x], command=lambda arg=x: btnClick(arg), width=20, height=1)希望对您有所帮助!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python