Как исправить KeyError для ключа из метода get () управляющей переменной - PullRequest
0 голосов
/ 09 февраля 2019

Код должен:

  • получить значение из виджета entry1
  • на основе этого значения в качестве ключа, посмотреть значения словаря
  • отобразить эти значенияв виджете entry2 PyCharm выдает KeyError: '' error.

Код не учитывает ошибку ввода пользователя, т. е. давайте предположим, что значение в виджете 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()

Идея состоит в том, что когда пользователь вводит «A» в entry1 и нажимает кнопку, в виджете entry2 появится «aa: 1».

Вместо этого я получаю следующее:

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

Тот же скрипт отлично работает вне Tkinter, поэтому он должен быть связан с GUI.Может быть, PyCharm знает, что в то время запись entry1 пуста и, следовательно, var = '' (и нет '' в my_Dict}? IDK ...

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 09 февраля 2019
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()

Проблема была в процедуре showResult () и объявлении объекта 'btn'.Когда btn создаст, будет вызван подключенный слот, но в это время объект var является пустой строкой.Это произойдет в случае исключения подсказки KeyError в showResult () при объявлении объекта сообщения.

Вместо этого используйте лямбда-выражение или измените метод showResult () следующим образом:

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

btn = ttk.Button(window, text='SHOW', command=showResult)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...