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