根据列中的唯一值创建下拉列表,并将选定的值分配给变量

时间:2017-07-27 09:35:50

标签: python pandas tkinter ipython-notebook

我有一个巨大的数据框:

              df
 code_1     code_2    code_3
065.0055     3315      N-W
067.3355     4511      S-E
065.0055     3315      N-W
034.0035     4511      N-W
067.3355     1311      S-E
...

在原始数据框中,有几列和大量行。

我需要在code_1code_2code_3列中找到唯一值,然后创建一个下拉列表并将所选值分配给特定变量。我需要分别为每个列执行此操作。

例如,我在列code_1中找到所有唯一值,用户从下拉列表中选择所需的值(例如065.0055),并将此值分配给变量(vl = '065.0055')。

我需要将所选值分配给变量,以便我可以继续根据它们进行计算。

我找到了如何创建下拉列表,但我不知道如何分配所选值(如vl中的示例所示)

这是我的代码:

import ipywidgets as widgets
from IPython.display import display
from IPython.html.widgets import interactive

items = ['-']+sorted(df['code_1'].unique().tolist())

def view(x=''):
    if x=='-':
        return df
    return df[df['code_1']==x]

w = widgets.Select(options=items)
interactive(view, x=w)

因此,我需要获得三个变量,例如: 如果用户做出以下选择:从code_1选择065.0055,从code_2选择3315,则选择code_3 S-E

我需要获得三个变量

vl1 = '065.0055'
vl2 = '3315'
vl3 = 'S-E'

我需要建议!

UPD 在研究了几个问题之后,我决定尝试使用Tkinter 这是我的代码:

items = ['-']+sorted(df['code_1'].unique().tolist())
items1 = ['-']+sorted(df['code_2'].unique().tolist())
items2 = ['-']+sorted(df['code_3'].unique().tolist())

from tkinter import*

class MyOptionMenu(OptionMenu):
    def __init__(self, master, status, *options):
        self.var = StringVar(master)
        self.var.set(status)
        OptionMenu.__init__(self, master, self.var, *options)
        self.config(font=('calibri',(10)),bg='white',width=12)
        self['menu'].config(font=('calibri',(10)),bg='white')

root = Tk()
optionList = items
optionList1 = items1
optionList2 = items2
mymenu1 = MyOptionMenu(root, 'Select code_1', *optionList)
mymenu2 = MyOptionMenu(root, 'Select code_2', *optionList1)
mymenu3 = MyOptionMenu(root, 'Select code_3', *optionList2)
mymenu1.pack()
mymenu2.pack()
mymenu3.pack()
root.mainloop()

如何将选择结果保存到变量?

1 个答案:

答案 0 :(得分:1)

OptionMenu的当前选择存储在 StringVar 中。您可以使用StringVar的.get()方法获取它:

selection1 = mymenu1.var.get()

如果您想保存所有当前选择,例如当用户按下按钮时,您可以在root.mainloop()之前添加以下内容:

def save_selected_values():
    global values
    values = [mymenu1.var.get(), mymenu2.var.get(), mymenu3.var.get()]
    print(values)

button = Button(root, text="OK", command=save_selected_values)
button.pack()