gpt4 book ai didi

python - 有没有更简单的方法来编写涉及多个组合框和嵌套字典的代码,并且还可以避免 KeyError?

转载 作者:太空宇宙 更新时间:2023-11-03 20:08:50 24 4
gpt4 key购买 nike

我对 Python 相当陌生,在花了很多时间之后,我设法在不问问题的情况下使其工作,但是,它绝对看起来可以更好地重写,并以某种方式摆脱这个 key 错误:''。关键错误仅出现(并停止函数),直到我从每个组合框中选择了一个项目,然后由于我在函数中的数学运算而恢复它,但我无法找出另一种编写它的方法来解决该问题并且让代码更加紧凑。我确信有办法,但我绝对可以使用指向正确方向的指针,谢谢!这是我的程序的一个更简单的演示版本:

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()

目标只是从每个组合框中进行选择并获取其指定值,将该整数添加到另一个组合框中以得出总数,同时解决按键错误问题并使代码更具可读性和更易于编辑。我想放多个盒子,每个盒子有多个元素,这种方法会变得非常困惑,提前谢谢你!

最佳答案

问题是 tk.StringVar get() 方法调用将在其中没有任何内容时返回 ""。一个简单的修复方法是向两个字典添加一个与此“空”键匹配的条目,并为它们提供一些关联值,以便在相应的组合框中未选择任何内容(即零)时使用。 :

#DICTIONARIES#
weapondict = {"": {"atk":0, "def":0}, # Use when nothing is selected.
"Bronze Sword": {"atk":32, "def":4},
"Iron Sword": {"atk":47, "def":5}}
shielddict = {"": {"atk":0, "def":0}, # Use when nothing is selected.
"Bronze Shield": {"atk":3, "def":10},
"Iron Shield": {"atk":5, "def":27}}

另一种方法是修改 selected() 函数来检查 weaponvar.get()shieldvar.get()< 返回的值是否相同 在尝试使用它们之前是相应字典中的键。如果不是,则 abcd 的一些默认值可能是提供。

这是完全可行的,但在我看来,更改两个字典似乎要容易得多。

另请注意两个嵌套字典的定义方式。我发现在多行上这样做更具可读性。

关于python - 有没有更简单的方法来编写涉及多个组合框和嵌套字典的代码,并且还可以避免 KeyError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58810911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com