需要帮助将多绑定tkinter combobox python脚本调整为嵌套字典源代码吗

2024-05-12 14:21:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个三层有界的tkinter组合框,我正在尝试将我的脚本更改为源代码,从一个嵌套字典,而不是一个字典和一个嵌套列表。我的问题是对这个问题的后续行动

下面是我用来构造组合框的地理源的脚本

def GeoLoad():
    global State
    State = {
        "Alabama":['Albertville, AL'],
        "Alaska":['Anchorage, AK', 'Fairbanks, AK'] }
    global Zip
    Zip = [
    # Alaska
        # Anchorage, AK
        [['99501'],['99502'],['99503'],['99504'],['99505'],['99506'],['99507'],['99508'],['99509'],['99510'],['99511'],['99513'],['99514'],               ['99515'],['99516'],['99517'],['99518'],['99519'],['99520'],['99521'],['99522'],['99523'],['99524'],['99529'],['99530'],['99540'],               ['99567'],['99577'],['99587'],['99599'],['99629'],['99645'],['99652'],['99654'],['99667'],['99674'],['99676'],['99683'],['99687'],               ['99688'],['99694'],['99695']],    
        # Fairbanks, AK
        [['99701'],['99702'],['99703'],['99705'],['99706'],['99707'],['99708'],['99709'],['99710'],['99711'],['99712'],['99714'],['99716'],               ['99725'],['99775'],['99790']],

    # Alabama
        # Albertville, AL
        [['wefwe'],['99502'],['99503'],['99504'],['99505'],['99506'],['99507'],['99508'],['99509'],['99510'],['99511'],['99513'],['99514'],['99515'],['99516'],['99517'],['99518'],['99519'],['99520'],['99521'],['99522'],['99523'],['99524'],['99529'],['99530'],['99540'],['99567'],['99577'],['99587'],['99599'],['99629'],['99645'],['99652'],['99654'],['99667'],['99674'],['99676'],['99683'],['99687'],['99688'],['99694'],['99695']] ]

如果我要为每个州(CBSA和Zip)构建这个,这将需要很长时间,需要大量代码,并且可能需要维护。相反,我保存了一个从Oracle表中获取这三个字段的pickle数据框。此数据帧如下所示:

enter image description here

在这个website上,我找到了一种方法来获取数据帧并将其转换为嵌套字典

GeoHierDict = {k: f.groupby('CBSA_NAME')['ZIP_CODE'].apply(list).to_dict()
                for k, f in GeoHier.groupby('STATE')}

以下是其输出的示例:

enter image description here

我想做的是找到一种方法来调整下面的tkinter脚本,以便它引用嵌套的GeoHierDictionary,而不是由dictionary和嵌套列表组成的GeoLoad()函数。GeoHierDictionary是按照我想要的方式设置的,但是我需要调整下面的脚本来解释它。组合框必须按照其父项填充,这一点很重要。下面是一个脚本,它与前面的方法一起工作,我正试图调整它以适应嵌套字典方法

任何帮助或见解都将不胜感激

import tkinter as tk
from tkinter import ttk

GeoLoad() 

lst = [x for y in list(State.values()) for x in y]


def change_dropdown(*args):

    print("Chosen brand " + tkvar.get())

    if args[0] == 'PY_VAR0':
        for x, y in State.items():
            if tkvar.get() == x:
                tkvar2.set(y[0])
                popupMenu2.configure(values=y)
        
    if args[0] == 'PY_VAR1':
        for x, y in zip(lst, Zip):
            if tkvar2.get() == x:            
                tkvar3.set(y[0])
                popupMenu3.configure(values=y)
        
    return
    
root = tk.Tk()
root.geometry('250x100')
font = ("Courier", 16, "bold")

tkvar = tk.StringVar(root)
tkvar.trace('w', change_dropdown)

tkvar2 = tk.StringVar(root)
tkvar2.trace('w', change_dropdown)

# -----------------------------------------------------------------------------------------------------------------------------------------------
# Geography:
# -----------------------------------------------------------------------------------------------------------------------------------------------
labelTop = tk.Label(root, text = "Geography",font='Helvetica 10 bold')
labelTop.grid(row=0, column=0, columnspan=2, sticky="ew")

labelTop = tk.Label(root, text = "Select a State:")
labelTop.grid(row=1, column=0, sticky=tk.W)
popupMenu1 = ttk.Combobox(root, textvariable=tkvar, values=list(State.keys()))
popupMenu1.grid(row=1, column=1)

labelTop = tk.Label(root, text = "Select a CBSA:")
labelTop.grid(row=2, column=0, sticky=tk.W)
popupMenu2 = ttk.Combobox(root, textvariable=tkvar2, values=[])
popupMenu2.grid(row=2, column=1)

tkvar3 = tk.StringVar(root)
labelTop = tk.Label(root, text = "Select a Zip Code:")
labelTop.grid(row=3, column=0, sticky=tk.W)
popupMenu3 = ttk.Combobox(root, textvariable=tkvar3, values=[])
popupMenu3.grid(row=3, column=1)

root.mainloop()

最终结果应该是这样的:

enter image description here

更新1 下面是我用来创建数据帧的精选代码:

#---------------------------------------------------------------------------------------------------------------------------
# Geography Hierarchy:
#---------------------------------------------------------------------------------------------------------------------------
print("Querying Geography Hierarchy table...")

GeoHierQuery = """
SELECT DISTINCT
STATE, CBSA_NAME, ZIP_CODE
FROM SRC_TABLE

ORDER BY STATE, CBSA_NAME, ZIP_CODE
"""

df_GeoHierQuery = pd.read_sql(GeoHierQuery, con=conn);
# print(df_GeoHierQuery)

df_GeoHierQuery.to_pickle(r'C:\Users\USER123\df_GeoHierQuery.pkl');

GeoHier = pd.read_pickle(r'C:\Users\USER123\df_GeoHierQuery.pkl');
# print(GeoHier)

GeoHierDict = {k: f.groupby('CBSA_NAME')['ZIP_CODE'].apply(list).to_dict()
                for k, f in GeoHier.groupby('STATE')}
# GeoHierDict["CO"]["BOULDER, CO"]

print("Geography Hierarchy table saved")

源绑定到Oracle表。如果您只是尝试获取要测试的数据帧,下面是一个脚本,它将使用前面提到的初始地理示例生成该结果:

df_GeoHier = {'STATE': ['AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL'], 'CBSA_NAME': ['Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL'], 'ZIP_CODE': ['99501','99502','99503','99504','99505','99506','99507','99508','99509','99510','99511','99513','99514','99515','99516','99517','99518','99519','99520','99521','99522','99523','99524','99529','99530','99540','99567','99577','99587','99599','99629','99645','99652','99654','99667','99674','99676','99683','99687','99688','99694','99695','99701','99702','99703','99705','99706','99707','99708','99709','99710','99711','99712','99714','99716','99725','99775','99790','35016','35031','35087','35175','35747','35754','35755','35760','35769','35776','35950','35951','35952','35956','35957','35962','35964','35975','35976','35980']}
df = pd.DataFrame(data=df_GeoHier)
df

更新2 以下是我目前正在使用的完整脚本:

import pandas as pd; import tkinter as tk; from tkinter import ttk;

df_GeoHier = {'STATE': ['AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL'], 'CBSA_NAME': ['Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL'], 'ZIP_CODE': ['99501','99502','99503','99504','99505','99506','99507','99508','99509','99510','99511','99513','99514','99515','99516','99517','99518','99519','99520','99521','99522','99523','99524','99529','99530','99540','99567','99577','99587','99599','99629','99645','99652','99654','99667','99674','99676','99683','99687','99688','99694','99695','99701','99702','99703','99705','99706','99707','99708','99709','99710','99711','99712','99714','99716','99725','99775','99790','35016','35031','35087','35175','35747','35754','35755','35760','35769','35776','35950','35951','35952','35956','35957','35962','35964','35975','35976','35980']}
df = pd.DataFrame(data=df_GeoHier)
df

import tkinter as tk
from tkinter import ttk

# GeoLoad() 

lst = [x for y in list(State.values()) for x in y]


def change_dropdown(*args):

    if args[0] == 'PY_VAR0':
        for x, y in State.items():
            if tkvar.get() == x:
                tkvar2.set(y[0])
                popupMenu2.configure(values=y)

    if args[0] == 'PY_VAR1':
        for x, y in GeoHierDict.items():
            if tkvar2.get() == list(y.keys())[0]:            
                tkvar3.set(list(y.values())[0][0])
                popupMenu3.configure(values=list(y.values())[0])
        
    return
    
root = tk.Tk()
root.geometry('250x100')
font = ("Courier", 16, "bold")

tkvar = tk.StringVar(root)
tkvar.trace('w', change_dropdown)

tkvar2 = tk.StringVar(root)
tkvar2.trace('w', change_dropdown)

# -----------------------------------------------------------------------------------------------------------------------------------------------
# Geography:
# -----------------------------------------------------------------------------------------------------------------------------------------------
labelTop = tk.Label(root, text = "Geography",font='Helvetica 10 bold')
labelTop.grid(row=0, column=0, columnspan=2, sticky="ew")

labelTop = tk.Label(root, text = "Select a State:")
labelTop.grid(row=1, column=0, sticky=tk.W)
popupMenu1 = ttk.Combobox(root, textvariable=tkvar, values=list(State.keys()))
popupMenu1.grid(row=1, column=1)

labelTop = tk.Label(root, text = "Select a CBSA:")
labelTop.grid(row=2, column=0, sticky=tk.W)
popupMenu2 = ttk.Combobox(root, textvariable=tkvar2, values=[])
popupMenu2.grid(row=2, column=1)

tkvar3 = tk.StringVar(root)
labelTop = tk.Label(root, text = "Select a Zip Code:")
labelTop.grid(row=3, column=0, sticky=tk.W)
popupMenu3 = ttk.Combobox(root, textvariable=tkvar3, values=[])
popupMenu3.grid(row=3, column=1)

root.mainloop()

Tags: dfforcolumnroottkgridrowak
1条回答
网友
1楼 · 发布于 2024-05-12 14:21:07

这里使用这个:

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

df_GeoHier = {'STATE': ['AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AK','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL','AL'], 'CBSA_NAME': ['Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Anchorage, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Fairbanks, AK', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL', 'Albertville, AL'], 'ZIP_CODE': ['99501','99502','99503','99504','99505','99506','99507','99508','99509','99510','99511','99513','99514','99515','99516','99517','99518','99519','99520','99521','99522','99523','99524','99529','99530','99540','99567','99577','99587','99599','99629','99645','99652','99654','99667','99674','99676','99683','99687','99688','99694','99695','99701','99702','99703','99705','99706','99707','99708','99709','99710','99711','99712','99714','99716','99725','99775','99790','35016','35031','35087','35175','35747','35754','35755','35760','35769','35776','35950','35951','35952','35956','35957','35962','35964','35975','35976','35980']}
df = pd.DataFrame(data=df_GeoHier)


def change_dropdown(*args):
    
    if args[0] == 'PY_VAR0':
        for x, y in GeoHierDict.items():
            if tkvar.get() == x:
                tkvar2.set(list(y.keys())[0])
                popupMenu2.configure(values=list(y.keys()))

    if args[0] == 'PY_VAR1':
        for x, y in GeoHierDict.items():
            for key, value in y.items():
                if tkvar2.get() == key:            
                    tkvar3.set(value[0])
                    popupMenu3.configure(values=value)
            
    return
    
root = tk.Tk()
root.geometry('250x100')
font = ("Courier", 16, "bold")

tkvar = tk.StringVar(root)
tkvar.trace('w', change_dropdown)

tkvar2 = tk.StringVar(root)
tkvar2.trace('w', change_dropdown)

GeoHierDict = {k: f.groupby('CBSA_NAME')['ZIP_CODE'].apply(list).to_dict()
                for k, f in df.groupby('STATE')}

labelTop = tk.Label(root, text = "Geography",font='Helvetica 10 bold')
labelTop.grid(row=0, column=0, columnspan=2, sticky="ew")

labelTop = tk.Label(root, text = "Select a State:")
labelTop.grid(row=1, column=0, sticky=tk.W)
popupMenu1 = ttk.Combobox(root, textvariable=tkvar, values=list(set(df['STATE'])))
popupMenu1.grid(row=1, column=1)

labelTop = tk.Label(root, text = "Select a CBSA:")
labelTop.grid(row=2, column=0, sticky=tk.W)
popupMenu2 = ttk.Combobox(root, textvariable=tkvar2, values=[])
popupMenu2.grid(row=2, column=1)

tkvar3 = tk.StringVar(root)
labelTop = tk.Label(root, text = "Select a Zip Code:")
labelTop.grid(row=3, column=0, sticky=tk.W)
popupMenu3 = ttk.Combobox(root, textvariable=tkvar3, values=[])
popupMenu3.grid(row=3, column=1)

root.mainloop()

相关问题 更多 >