Home > Software design >  function as argument for callback-function with tkinter
function as argument for callback-function with tkinter

Time:10-11

I am using SQLite and tkinter in Python 3.9 and got the following problem:

I got 1 SQLite DB with 2 tables. I am using the coloumn of one of the tables for a tkinter option menu. Now I want to trace the variable selected and display a corresponding value from the other table on a tk.label. OptionMenu and label are in the same window.

This is what I tried but returns: TypeError: 'NoneType' object is not callable

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

optionMenuVar1.trace("w", callBackFct(optionMenuVar1.get()))

If I let the function get the variable like this...

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

optionMenuVar1.trace("w", callBackFct))

it works, but I have 50 labels and dont want to copy paste 50 functions. There hast to be a more elegant solution right, where I can give an argument to the callback function?! Please help. It seems like I have missunderstood something basic...

CodePudding user response:

Every function in python needs to return something. So when you do this callBackFct(optionMenuVar1.get()) callBackFct returns None since it returns nothing else. lambda is a way to store a function with provided arguments and is not executed when declared.

You can use an annonymous function for this case.

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

Another maybe easier way to understand is to follow this Tutorial/Documentation here. Which could lead to the following code for you:

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

optionMenuVar1.trace("w", callBackFct))
  • Related