根据选择的单选按钮搜索不同的字典

时间:2017-03-31 20:02:03

标签: python dictionary tkinter

我有一个程序,它使用库来检索关键字的注释。 目前它工作得很好但是我想添加一个功能,允许我选择不同的词典,使用单选按钮来更改我正在搜索的词典。

正在调用字典:

rms_notes = { "SomeKey" : "Some random notes" }
vzt_notes = { "SomeKey" : "Some random notes" }
nsr_notes = { "SomeKey" : "Some random notes" }

所以我的RadioButtons如下。

RaBu1 = tkinter.Radiobutton(root,text="Lib1",variable = vl, value = 1)
RaBu2 = tkinter.Radiobutton(root,text="Lib2",variable = vl, value = 2)
RaBu3 = tkinter.Radiobutton(root,text="Lib3",variable = vl, value = 3)
RaBu1.place(#all the formatting here)
RaBu2.place(#all the formatting here)
RaBu3.place(#all the formatting here)

现在我的库被调用:

keywordEntry = Entry(root)
keywordEntry.bind('<Return>', kw_entry)
KeywordEntry.place(#all the formatting here)

选择单选按钮时,我用来访问每个不同字典的函数如下:

v1 = IntVar()
def kw_entry(event=None):
    libvar = v1.get()
    e1Current = keywordEntry.get().lower()
    if libvar == 1:
        if e1Current in rms_notes:
            root.text.delete(1.0, END)
            root.text.insert(tkinter.END, rms_notes[e1Current])
            root.text.see(tkinter.END)
        else:
            root.text.delete(1.0, END)
            root.text.insert(tkinter.END, "Not a Keyword")
            root.text.see(tkinter.END)
    elif libvar == 2:
        if e1Current in vzt_notes:
            root.text.delete(1.0, END)
            root.text.insert(tkinter.END, vzt_notes[e1Current])
            root.text.see(tkinter.END)
        else:
            root.text.delete(1.0, END)
            root.text.insert(tkinter.END, "Not a Keyword")
            root.text.see(tkinter.END)
    elif libvar == 3:
        if e1Current in nsr_notes:
            root.text.delete(1.0, END)
            root.text.insert(tkinter.END, nsr_notes[e1Current])
            root.text.see(tkinter.END)
        else:
            root.text.delete(1.0, END)
            root.text.insert(tkinter.END, "Not a Keyword")
            root.text.see(tkinter.END)
    else:
        root.text.delete(1.0, END)
        root.text.insert(tkinter.END, "No Library select")
        root.text.see(tkinter.END)

这是我的预期,但我想知道是否有更好的方法将每个字典调用到此功能?感觉应该有一种更简洁的方法来使用更短的代码执行此任务。

我可能错了,但如果有人对此事有任何想法或意见,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以使用数组索引和单选按钮变量值将它们保存在一个dicts数组中,以访问相关的dict。一旦声明了你的dicts,就像:

dict_Container = [rms_notes, vzt_notes, nsr_notes]

然后:

if e1Current in dictContainer[libvar]:

答案 1 :(得分:0)

所以经过一些挖掘并以Daniel.VanWagnen写的为起点,我想出了如何压缩我的if语句。

我必须创建一个字典,其中包含我用来存储笔记的不同字典的名称。我确保创建键以匹配radioButtons变量中的值。这允许我使用当前变量来调用存储的字典名称,并在if语句的其余部分中使用它。

我不确定这是否是执行此操作的最佳方式,但我已设法将代码压缩为比以前更智能的if语句。

现在我要做的就是为了将来更新这个,如果我要添加更多音符部分,就是添加一个新的radioButton并获取下一个可用值(在本例中为4)并添加新的value:dict_name到我的vrange词典。

我相信我也可以对此进行简化,我也将继续努力,但是现在这是我原来问题的答案,如果有人有兴趣的话。

v1 = IntVar()


def update_var(event=None):
    current_var = v1.get()
    e1Current = keywordEntry.get().lower()
    vrange= {1: vzt_notes,2:rms_notes,3:nsr_notes}
    if current_var in vrange:
        note_var = vrange[current_var]
        if e1Current in note_var:
            note_var = vrange[current_var]
            root.text.delete(1.0, END)
            root.text.insert(tkinter.END, note_var[e1Current])
            root.text.see(tkinter.END)
        else:
            root.text.delete(1.0, END)
            root.text.insert(tkinter.END, "Not a Keyword")
            root.text.see(tkinter.END)
    else:
        root.text.delete(1.0, END)
        root.text.insert(tkinter.END, "No Library Selected")
        root.text.see(tkinter.END)