函数作为带tkinter的回调函数的参数



我在Python 3.9中使用SQLite和tkinter,并得到以下问题:

我得到1 SQLite DB与2表。

我使用其中一个表的列作为tkinter选项菜单。现在,我想跟踪选定的变量,并在tk.label上显示另一个表中的相应值。OptionMenu和label在同一个窗口

这是我尝试的,但返回:TypeError: 'NoneType' object is not callable

def callBackFct(var):
cur.execute("""SELECT nameFromColumn FROM sqlDbTable WHERE condition = ?""", (var,))
f = cur.fetchall()
tkLabel1.config(text = f[0][0])
optionMenuVar1.trace("w", callBackFct(optionMenuVar1.get()))

如果我让函数像这样获取变量…

def callBackFct(*args):
var = optionMenuVar1.get() # getting variable inside function
cur.execute("""SELECT nameFromColumn FROM sqlDbTable WHERE condition = ?""", (var,))
f = cur.fetchall()
tkLabel1.config(text = f[0][0])
optionMenuVar1.trace("w", callBackFct))

它工作,但我有50个标签,不想复制+粘贴50个函数。必须有一个更优雅的解决方案,对吧,我可以给回调函数一个参数?!请帮助。似乎我有missunderstood一些基本…

python中的每个函数都需要返回一些东西。当你这样做的时候,callBackFct(optionMenuVar1.get())callBackFct返回None因为它没有返回任何其他东西。lambda是一种存储带有所提供参数的函数的方式,声明时不执行。

在这种情况下可以使用匿名函数。

import tkinter as tk
def test(x):
print(x)
root = tk.Tk()
var = tk.StringVar()
opt = tk.OptionMenu(root,var,value='hi')
opt.pack()
var.trace('w',lambda *args:test(var.get()))
root.mainloop()

另一个可能更容易理解的方法是遵循这里的教程/文档。这可能会导致以下代码:

def callBackFct(var,idx,mod):
cur.execute("""SELECT nameFromColumn FROM sqlDbTable WHERE condition = ?""", (var.get(),))
f = cur.fetchall()
tkLabel1.config(text = f[0][0])
optionMenuVar1.trace("w", callBackFct))

最新更新