【问题标题】:How to give button ID when calling a create button function调用创建按钮功能时如何提供按钮 ID
【发布时间】:2019-05-22 12:27:43
【问题描述】:

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

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

假设仪表板上有两行,它们各自的文件名和按钮。我的问题是当我去按下第一行上的按钮时,它认为我正在按下第二行上的按钮只是因为在添加第二行时计数器设置为 2,我试图确定哪个按钮用户通过检查行来按下,但由于计数器而无法做到这一点。

在调用创建按钮函数时,我是否可以在声明它时将行值“绑定”到按钮,以便它们保留某种形式的 ID,并且我可以知道用户正在与哪一行进行交互?

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

我还尝试通过检查按钮的文本来检查用户正在按下的按钮,但是当重新调用该函数时,无论用户界面本身的按钮名称是否不同,它也会被覆盖。

非常感谢任何帮助。希望我已经足够清楚了。

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

【问题讨论】:

    标签: python-3.x tkinter


    【解决方案1】:

    一个简单而快速的解决方案就是给函数当前的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),改变了按钮命令的工作方式。基本上它是创建一个lambda 表达式来保存RowCounter 的值,当按下按钮时,它将传递给Execute() 函数。

    【讨论】:

    • 非常感谢您的回复!我刚刚尝试实施您的建议,现在该命令更改出现以下错误:AttributeError:'int' object has no attribute 'get'
    • @Mike 我更改了代码,我以为您使用 IntVar() 代替 RowCounter 现在应该可以工作了 :)。您现在必须让 execute 函数将行计数器作为输入,(例如 def Execute(self, rc):
    • 这对我不起作用 - 没有错误,但如果我添加两行并按下第一行的按钮,它仍然认为行值是 2,而它应该是 1
    • 没关系,我知道我做错了什么,这是一个很好的解决方案。非常感谢你的协助!不胜感激
    猜你喜欢
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2020-10-25
    相关资源
    最近更新 更多