0

我有一些问题,使用 tkinter 调用在另一个脚本中定义的 Python 函数。我希望有一个单独的脚本用于 GUI 在需要时使用的函数。目前我正在这样做。

ttk.Button(mainframe, text="1", command=one).grid(column=1, row=1, sticky=NW)

def one():
    code_entry.insert(END,"1")

上面在按钮单击时调用命令 one,它将使用 GUI 在输入字段中打印字符 one。我想我可以创建一个单独的脚本来保存我的函数并像这样调用它们:

ttk.Button(mainframe, text="1", command=functions.one()).grid(column=1, row=1, sticky=NW)

然后只需在我的 GUI 顶部添加一个导入语句,如下所示:

import functions

这不起作用,正在寻找一些关于如何解决这个问题的建议。

4

1 回答 1

1

您没有指定任何错误消息,但很可能您正在执行此操作 - 实际上是在创建 Button 之前fuctions.one()调用该模块的 one() 函数。只需删除 () 部分即可解决此问题 - 当您指定不带 () 的函数时,您传递的是函数对象的引用。

还要记住code_entry变量的范围 - 如果您之前将它用作模块级全局(或函数本地,如果one()与您的调用在同一个函数内ttk.Button),当您将它移动到新的时它将不可用没有code_entry.

要解决这个问题,您应该将code_entry作为参数传递给回调而不首先调用one()。通常的方法是创建一个 lambda - 本质上是创建一个在原来的相同范围内工作的函数,可以one()访问变量code_entry,但也可以调用不同模块中的函数。

ttk.Button(mainframe, text="1", command=lambda: functions.one(code_entry))

请注意,这与以下内容基本相同:

def some_anonymous_function():
    functions.one(code_entry)
ttk.Button(mainframe, text="1", command=some_anonymous_function)

这两个示例都创建了一个函数对象并将该对象作为引用传递 - lambda 的functions.one()调用实际上是在 lambda 函数的主体内部,稍后将由 tkinter 调用。

当然,您还必须重新定义 one() 以接受这个新参数:

def one(code_entry):
    code_entry.insert(END,"1")
于 2013-03-23T17:07:22.570 回答