我遇到了一些问题,使用tkinter调用另一个脚本中定义的Python函数。我更喜欢为我的功能提供一个单独的脚本,GUI在需要时使用。目前我正在这样做。
ttk.Button(mainframe, text="1", command=one).grid(column=1, row=1, sticky=NW)
def one():
code_entry.insert(END,"1")
上面的命令会在按钮单击时调用命令,它将使用GUI在输入字段中打印字符1。我以为我可以创建一个单独的脚本来保存我的函数并像这样调用它们:
ttk.Button(mainframe, text="1", command=functions.one()).grid(column=1, row=1, sticky=NW)
然后只需在我的GUI顶部添加一个import语句,如下所示:
import functions
这不起作用,并寻求有关如何处理此事的一些建议。
答案 0 :(得分:1)
您没有指定任何错误消息,但您很可能正在执行fuctions.one()
- 实际上在创建Button之前调用该模块的one()函数。它只是通过删除()部分来修复 - 当你指定一个没有()的函数时,你传递的是函数对象的引用。
还要记住code_entry
变量的范围 - 如果你之前使用它作为模块级全局(或者函数是本地的,如果one()
与你的{{1}在同一个函数中调用),当它移动到没有ttk.Button
的新命名空间时,它将不可用。
要解决这个问题,您应该将code_entry
作为参数传递给回调,而不是首先调用code_entry
。通常的方法是创建一个lambda - 基本上创建一个函数,它在原始one()
的相同范围内工作,可以访问one()
之类的变量,但也可以在不同的模块中调用函数。
code_entry
请注意,这基本上与:
相同ttk.Button(mainframe, text="1", command=lambda: functions.one(code_entry))
这两个示例都创建了一个函数对象并将该对象作为引用传递 - lambda的def some_anonymous_function():
functions.one(code_entry)
ttk.Button(mainframe, text="1", command=some_anonymous_function)
调用实际上位于lambda函数的主体内部,稍后由tkinter调用。
当然,您还必须重新定义一个()以接受这个新参数:
functions.one()