我在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))