首页 > 解决方案 > 有人可以帮我处理 tkinter“命令”中的参数吗

问题描述

我正在尝试仅使用按钮制作一个小文件浏览器,我仍处于早期阶段,并且想要制作一个功能打印按下哪个按钮并想出了这个:

import tkinter as tk

buttons = []

window = tk.Tk()
window.geometry("200x100")
def open(button):
    print(button)

def list(titles):
    i=0
    while i<(len(titles)):
        btn = tk.Button(text=titles[i], width=20, command=lambda: open(i))
        buttons.append(btn)
        buttons[i].grid(row=i, column=1)
        print(f"adding {titles[i]}")
        i=i+1

list(["title1", "title2", "title3"])
window.mainloop()

有一个问题:它总是打印3. 我想我知道问题出在哪里,i生成按钮后总是保持 3 所以它将 3 传递给函数,但我不知道如何解决它。我使用了 lambda 因为我不能只使用传递参数,并在这个问题open(i)上找到了 lambda 解决方案。

有人可以帮忙吗?天呐!

标签: pythontkinter

解决方案


因为当您再次分配它时,它会将命令覆盖在一个按钮上。做:

import tkinter as tk

buttons = []

window = tk.Tk()
window.geometry("200x100")

def open(button):
    print(button)

def list(titles):
    btn = tk.Button(text=titles[0], width=20, command=lambda: open(1))
    buttons.append(btn)
    buttons[0].grid(row=1, column=1)
    print(f"adding {titles[0]}")

    btn = tk.Button(text=titles[1], width=20, command=lambda: open(2))
    buttons.append(btn)
    buttons[1].grid(row=2, column=1)
    print(f"adding {titles[1]}")

    btn = tk.Button(text=titles[2], width=20, command=lambda: open(2))
    buttons.append(btn)
    buttons[2].grid(row=3, column=1)
    print(f"adding {titles[2]}")


list(["title1", "title2", "title3"])
window.mainloop()

推荐阅读