【问题标题】:tkinter command to call function from another Python scripttkinter 命令从另一个 Python 脚本调用函数
【发布时间】:2013-03-13 10:21:38
【问题描述】:

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

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

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

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

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

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

import functions

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

【问题讨论】:

    标签: function python-3.x tkinter


    【解决方案1】:

    您没有指定任何错误消息,但很可能您正在执行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")
    

    【讨论】:

    • @dequis 如果我想向函数传递一些值该怎么办?我有一个绘画应用程序,其中我在另一个脚本上编写了保存功能。为了使保存功能正常工作,它需要 tkinter 画布,我尝试通过 save.bind('<ButtonPress-1>', export.save_img(canvas)) 将画布传递给该函数,但它不起作用,但如果保存功能在同一个脚本中,则此方法有效 save.bind('<ButtonPress-1>', export.save_img) 请帮助我,因为其中我不能有任何需要主文件之外的参数的函数。
    猜你喜欢
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多