user13845379
user13845379

Reputation:

Combobox selected and display value in another combobox Tkinter

I'm unable to get lbox to display the values of selected cbox value. For example, if name: "juli" is selected in cbox, lbox will display their age "12", "14" automatically.

Does anyone know how to do it? Please let me know my mistakes in the code as well thank you.


from tkinter import *
from tkinter.ttk import *
from tkinter import ttk
import tkinter as tk
import pandas as pd


window = Tk()
window.title("TEST")
window.geometry("1400x800")
window.configure(bg='white')

df = [['tom', 10, 'Male'], ['juli, 12, 'Male'], ['nick', 15, 'Male'], ['juli', 14, 'Female'], ['nick', 20, 'Male']] #column = Name, Age, Gender
df3 = pd.DataFrame(df, columns=["Name", "Age", "Gender"])
df3.sort_values("Name", inplace=True)
df3.drop_duplicates(subset="Name", inplace=True)
df3["Name"].tolist()

def callback1(eventObject):
    global cutrow
    m = df3[df['Name'].str.contains(cbox.get())]
    #print(cbox.get())
    
    lbox.delete("0", "end")
    for row in df3[df3["Name"].eq(cbox.get())].iterrows():
        print(row)
    
    cutrow = m.loc[:, 'Age']
    cutrow.reset_index(drop=True, inplace=True)
    print(cutrow)


cutrow = StringVar()

cbox = Combobox(window,width=30, state="readonly", values="Name")
cbox.place(x=150,y=60)
cbox.current(0)

cbox.bind("<<ComboboxSelected>>", callback1)


lbox = Combobox(window, width=30, textvariable=cutrow, values="Age")
lbox.place(x=150,y=90)
lbox.current(0)


window.mainloop()

Upvotes: 0

Views: 1238

Answers (1)

Fab
Fab

Reputation: 161

below there is an example of how you can achieve that. Run the code and you'll see it works.

from tkinter import *
from tkinter.ttk import *

window = Tk()

df = [['tom', 10, 'Male'], ['juli', 12, 'Male'], ['nick', 15, 'Male'], ['juli', 14, 'Female'], ['nick', 20, 'Male']] #column = Name, Age, Gender

def callback1(e):
    name = cbox.get()
    lbox.delete("0", "end")
    values_from_selected_name = list(set([record[1] for record in df if record[0]==name]))
    lbox['values'] = values_from_selected_name

Label(window, text='Name: ').grid(row=0, column=0, padx=10, pady=10)
cbox = Combobox(window, width=10, state="readonly")
cbox.grid(row=0, column=1)
all_values = list(set([record[0] for record in df]))
cbox['values'] = all_values
cbox.bind("<<ComboboxSelected>>", callback1)

Label(window, text='Age: ').grid(row=1, column=0)
lbox = Combobox(window, width=10)
lbox.grid(row=1, column=1, padx=10, pady=10)

window.mainloop()

You may note several things:

  • I have corrected your code where not working
  • you did redundant imports (by the way, it's better to avoid to use "import *", but I kept it for simplicity)
  • you have used a number of redundant variables (like the StringVar() that's not needed). I have cleared everything to the minimum
  • I have given an example using lists and not pandas dataframes, to keep it simple. If you want to go for pandas, you certainly can once you understood the correct logic of the code
  • you would normally use 'pack' or 'grid' as geometry managers, rather than 'place'. I have amended accordingly.

Upvotes: 1

Related Questions