使用 tkinter 作为回调函数的参数

function as argument for callback-function with tkinter

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

我有 1 个 SQLite 数据库和 2 tables。

我正在使用 table 之一的列作为 tkinter 选项菜单。 现在我想跟踪所选变量并在 tk.label 上显示另一个 table 的相应值。 OptionMenu 和 label 在同一个 window.

这是我尝试过的方法 returns: 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 个函数。必须有一个更优雅的解决方案,我可以在其中为回调函数提供参数?! 请帮忙。好像我误解了一些基本的东西...

python 中的每个函数都需要 return 一些东西。所以当你这样做时 callBackFct(optionMenuVar1.get()) callBackFct returns None 因为它 return 没有别的。 lambda 是一种使用提供的参数存储函数的方法,而不是executed when declared

对于这种情况,您可以使用 annonymous function

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()

另一种可能更容易理解的方法是按照 Tutorial/Documentation 此处进行操作。这可能会导致以下代码:

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