【问题标题】:Get value from tkinter button [duplicate]从 tkinter 按钮获取价值 [重复]
【发布时间】:2021-09-21 14:44:19
【问题描述】:

我的按钮

button = ttk.Button(frame_file, text='Open file', command=lambda *args: openfile())
button.grid(row=1, column=1)

调用函数openfile()

def openfile():
    return fd.askopenfile()

如何在 main 中获取打开文件的路径(定义按钮的位置?)

【问题讨论】:

标签: python tkinter button


【解决方案1】:

你为什么想要它?与大多数 gui 库一样,Tkinter 是面向事件的。这个想法是事件发生时应该由称为('fired')的代码处理。如果您需要将状态从按钮传递给其他东西,有几个选项:

全局变量:

fn = None
...
def openfile(*args):
    global fn
    fn = ...

稍微好一点:全局对象:

state = {}
...
def openfile(*args):
    state["fn"] = ...

但此时你有状态飞来飞去。如果您真的需要这样做,您可能应该考虑将该状态封装在一个 class 中,该类将处理该操作:

class FileDoStuff:
    def __init__(self, row, column, frame_file):
        self.button = ttk.Button(frame_file, "Open File", self.on_click)
        self.button.grid(row, column)
        self.fn = None

    def on_click(self, *args):
        self.fn = ...

正如在另一个答案中所指出的,您的 lambda 没有做任何事情,除了吞噬参数,这可以在 fn 本身中完成(就像我在这里所做的那样)。

【讨论】:

  • 我想这样做是因为,例如,当我打开文件时,我想将它的路径传递给另一个函数
  • 但是您不想在按下按钮时调用该函数?无论如何,这些解决方案中的一种可能会起作用。
  • 但是如何将类与按钮联系起来?
【解决方案2】:

您必须将其存储在两个函数都可以访问的变量中,例如全局变量或实例属性。如果您想在创建按钮的同一个函数中访问它,请注意该函数可能在用户有机会看到并单击按钮之前已经返回。

另外,顺便说一句,您可以通过删除lambda 来降低按钮命令的复杂性:

button = ttk.Button(frame_file, text='Open file', command=openfile)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    相关资源
    最近更新 更多