如何从控制变量get()方法修复键的KeyError

时间:2019-02-09 06:58:28

标签: database python-3.x tkinter

该代码应该:

  • entry1小部件中的抓取值
  • 基于此值作为键,查找字典值
  • 在entry2小部件中显示这些值 PyCharm给出了KeyError:''错误。

该代码未考虑用户的输入错误,即,假设entry1小部件中的值是合法的myDict键。

import tkinter as tk
from tkinter import ttk

window = tk.Tk()
window.geometry('300x300')
window.title('test')

def showResult():
    x = var.get()
    message = list(my_Dict[x].values())
    result.set(str(message))

my_Dict= {'A': {'aa': 1}, 'B': {'bb': 2}, 'C': {'cc': 3}}

label = ttk.Label(window, text='Enter here').grid(row=0, column=0)
var = tk.StringVar()
entry1 = ttk.Entry(window, textvariable=var).grid(row=0, column=1)

label = ttk.Label(window, text='"Result here').grid(row=2, column=0)
result = tk.StringVar()
entry2 = ttk.Entry(window, textvariable=result).grid(row=2, column=1)

btn = ttk.Button(window, text='SHOW', command=showResult())
btn.grid(row=1, column=0)

window.mainloop()

这个想法是,当用户在条目1中输入“ A”并按下按钮时, “'aa':1” 将出现在entry2小部件中。

相反,我得到这个:

File "...../test.py", line 10, in showResult
message = list(my_Dict[x].values())
KeyError: ''

同一脚本在Tkinter外部也可以正常工作,因此它必须与GUI有关。 也许PyCharm知道当时entry1为空,因此var =''(my_Dict中没有''键)} IDK ...

谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

4,3,2

问题出在showResult()过程和'btn'对象的声明中。 创建btn时,将调用连接的插槽,但此时var对象是一个空字符串。消息对象删除时,showResult()中会出现提示KeyError异常。

改为使用lambda表达式或重构showResult(),如下所示:

import tkinter as tk

from tkinter import ttk

window = tk.Tk()
window.geometry('300x300')
window.title('test')

def showResult():
    x = var.get()
    message = list(my_Dict[x].values())
    result.set(str(message))

my_Dict= {'A': {'aa': 1}, 'B': {'bb': 2}, 'C': {'cc': 3}}

label = ttk.Label(window, text='Enter here').grid(row=0, column=0)
var = tk.StringVar()
entry1 = ttk.Entry(window, textvariable=var).grid(row=0, column=1)

label = ttk.Label(window, text='"Result here').grid(row=2, column=0)
result = tk.StringVar()
entry2 = ttk.Entry(window, textvariable=result).grid(row=2, column=1)

btn = ttk.Button(window, text='SHOW', command=lambda: showResult())
btn.grid(row=1, column=0)

window.mainloop()