Поле со списком выбрано и отображает значение в другом поле со списком Tkinter - PullRequest
0 голосов
/ 14 июля 2020

Я не могу получить lbox для отображения значений выбранного значения cbox. Например, если в cbox выбрано имя: «juli», lbox автоматически отобразит их возраст «12», «14».

Кто-нибудь знает, как это сделать? Пожалуйста, дайте мне знать мои ошибки в коде, а также спасибо.


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

1 Ответ

1 голос
/ 14 июля 2020

Ниже приведен пример того, как вы можете этого добиться. Запустите код, и вы увидите, что он работает.

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

Вы можете отметить несколько вещей:

  • Я исправил ваш код, где он не работает
  • вы сделал избыточный импорт (кстати, лучше избегать использования "import *", но я оставил его для простоты)
  • вы использовали несколько избыточных переменных (например, StringVar (), которые не нужны) . Я очистил все до минимума
  • Я привел пример, используя списки, а не pandas фреймы данных, чтобы было проще. Если вы хотите go для pandas, вы, безусловно, сможете, как только вы поймете правильную логику c кода
  • , вы обычно будете использовать 'pack' или 'grid' в качестве менеджеров геометрии, а не 'место'. Я внес соответствующие изменения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...