Существует ли более простой способ написания этого кода с использованием нескольких комбинированных списков и вложенных словарей, а также избежание ошибки KeyError? - PullRequest
1 голос
/ 12 ноября 2019

Я довольно новичок в Python, и, потратив много часов, мне удалось заставить это работать без необходимости задавать вопрос, однако, определенно кажется, что его можно переписать лучше и таким образом, чтобы избавиться от этого KeyError: ''. Ключевая ошибка появляется (и останавливает функцию) только до тех пор, пока я не выберу элемент из каждого выпадающего списка, затем она возобновляется из-за моей математики в функции, но я не могу найти другой способ написать ее, которая решит эту проблему исделать код более компактным. Я уверен, что есть способ, но я определенно мог бы использовать указатель в правильном направлении, спасибо! Вот более простая демонстрационная версия моей программы:

import tkinter as tk
import tkinter.ttk as ttk

#DICTIONARIES#
weapondict = {"Bronze Sword": {"atk":32, "def":4}, "Iron Sword": {"atk":47, "def":5}}
shielddict = {"Bronze Shield": {"atk":3, "def":10}, "Iron Shield": {"atk":5, "def":27}}

#FUNCTION#
def selected(func):
    a = weapondict[weaponvar.get()]["atk"]
    b = shielddict[shieldvar.get()]["atk"]
    atkvar.set(a + b)
    c = weapondict[weaponvar.get()]["def"]
    d = shielddict[shieldvar.get()]["def"]
    defvar.set(c + d)

#WINDOWLOOP#
root = tk.Tk()
root.geometry("250x125")

#VARIABLES#
weaponvar = tk.StringVar()
shieldvar = tk.StringVar()
atkvar = tk.IntVar()
defvar = tk.IntVar()

#COMBOBOXES#
weaponbox = ttk.Combobox(root, height=5, state="readonly", values=list(weapondict.keys()), textvariable=weaponvar)
weaponbox.place(x=10, y=10, width=130)
weaponbox.bind('<<ComboboxSelected>>', func=selected)

shieldbox = ttk.Combobox(root, height=5, state="readonly", values=list(shielddict.keys()), textvariable=shieldvar)
shieldbox.place(x=10, y=70, width=130)
shieldbox.bind('<<ComboboxSelected>>', func=selected)

#LABELS#
atklabel = tk.Label(root, text='Atk Bonus:')
atklabel.place(x=150, y=10, width=70, height=20)

deflabel = tk.Label(root, text='Def Bonus:')
deflabel.place(x=150, y=70, width=70, height=20)

atktotal = tk.Label(root, textvariable=atkvar)
atktotal.place(x=155, y=30, width=100, height=20)

deftotal = tk.Label(root, textvariable=defvar)
deftotal.place(x=155, y=90, width=100, height=20)

root.mainloop()

Цель состоит в том, чтобы просто взять выбор из каждого комбинированного списка и принять его заданное значение, добавить это целое число к другому, чтобы получить общее значение, одновременно решаяпроблема ключевой ошибки и делает код более читабельным и простым для редактирования. Я хочу поставить несколько ящиков, каждый с несколькими предметами, и при таком подходе будет очень запутанно, заранее спасибо!

...