调用创建按钮功能时如何提供按钮ID

时间:2019-05-22 12:27:43

标签: python-3.x tkinter

请原谅我的无知,因为我是Python的新手,正在尝试。

我正在创建一个仪表板,该仪表板允许用户打开文件。当用户打开文件时,软件会在同一行上添加一行,其中包含文件名,进度条和一些按钮。通过创建一个函数来完成行的创建,该函数在每次调用时都会递增行的值,以确保它不会替换现有行,而是在其下添加另一行以表示用户打开的最新文件。

假设仪表板上有两行,分别带有文件名和按钮。我的问题是,当我去按第一行上的按钮时,它认为我在按第二行上的按钮只是因为添加第二行时计数器设置为2,而我试图确定哪个按钮用户正在通过检查该行进行按压,但由于计数器而无法执行该操作。

无论如何,在调用create button函数时进行声明时,是否可以将行值“绑定”到按钮上,以便它们保留某种形式的ID,并且可以告诉用户与之交互的行?

我尝试在调用函数时为按钮分配一个ID,以标识正在按下哪个按钮以及在哪一行,但是当再次调用该函数时,所有行上的按钮都会被覆盖。

我还试图通过检查按钮的文本来检查用户所按下的按钮,但是无论用户界面上按钮的名称是否不同,调用该函数时,该按钮也会被覆盖。 / p>

非常感谢您的帮助。希望我足够清楚。

def OpenFile(self): # user opening file which creates row with button
        print("Opening")
        btnCreation(self)

def btnCreation(self): # function to create buttons dynamically
    incrementFunction(self)
    global EXEBtn
    EXEBtn = Button(Main_frame,
         text="Execute",
         width=8,
         command=self.Execute)
         EXEBtn.grid(row=RowCounter, column=2, padx=3)

def incrementFunction(self):
    global RowCounter 
    RowCounter = RowCounter + 1

def Execute(self):
    # check which row the execute button was pressed on to do something

1 个答案:

答案 0 :(得分:0)

一个简单而快速的解决方案是,使用如下的RowCounter表达式为函数提供当前的lambda值:

def btnCreation(self): # function that creates button dynamically
    incrementFunction(self)
    global EXEBtn
    EXEBtn = Button(Main_frame,
         text="Execute",
         width=8,
         command=lambda e=RowCounter: self.Execute(e))
         EXEBtn.grid(row=RowCounter, column=2, padx=3)

此处的具体更改是command=lambda e=RowCounter.get(): self.Execute(e),更改了button命令的工作方式。基本上,它是创建一个lambda表达式来保存RowCounter的值,该值将在按下按钮时传递给Execute()函数。