python - 获取“关键错误:var_cheeze_value11”
问题描述
我正在制作一个程序,该程序使用基本名称和变量(如它们的 id 和系列)生成变量。我用它来制作它们并使用该模块vars()[str(name+id+serie)]
使其成为按钮。tkinter
当我启动它时,它会一直工作,直到它尝试从中.get()
获得价值,说
keyError(变量名)
我试图改变它的命名方式,制作它int()
或移动它.get()
,但没有任何效果。
# -*- coding: utf-8 -*
from tkinter import *
import math
import random
fenetre = Tk()
fenetre.geometry("1000x1000")
kanvas=Canvas(fenetre, width=500, height=500, bg="white")
id = 0
serie = 1
idcounter=0
while 1:
print("serie =",serie)
def cheezegrater():
global serie,id,idcounter
vars()[str("var_cheeze_sum"+str(serie))]=0
for o in range(1,val+1):
print("var11 =",var_cheeze_value11.get())
vars()[str("var_cheeze_sum"+str(serie))] += vars()[str("var_cheeze_value"+str(id-val+o)+str(serie))].get()
kanvas.pack()
fenetre.mainloop()
vars()[str("nombre_de_formes"+str(serie))] =int(float(input("combien?")))
val = vars()[str("nombre_de_formes"+str(serie))]
for o in range(1,val+1):
id+=1
vars()[str("var_cheeze_value"+str(id)+str(serie))] = Entry(kanvas, width=10)
o+=1
vars()[str("var_cheeze_value"+str(id)+str(serie))].pack
kanvas.pack()
fenetre.mainloop()
Traceback (most recent call last): File "C:\Users\Utilisateur\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__ return self.func(*args) File "C:/Users/Utilisateur/.PyCharmEdu2019.1/config/scratches/scratch_1.py", line 38, in cheezegrater vars()[str("var_cheeze_sum"+str(serie))] += vars()[str("var_cheeze_value"+str(id-val+o)+str(serie))].get() KeyError: 'var_cheeze_value11'
解决方案
您在函数内部,因此在vars()
不包含这些变量的同一命名空间之外。看看这个例子:
x = 1
print('Outside', x, 'x' in vars())
def f():
global x
print('Inside', x, 'x' in vars())
f()
它打印:
Outside 1 True
Inside 1 False
如您所见,即使我们拥有global x
并且可以打印它的值,它也不是vars()
函数内部的键。
另外:为什么全局变量是邪恶的?
你当初为什么选择使用vars()
?也许您可以只使用一个单独的dict
对象?这个问题有很多信息Python: Using vars() to assign a string to a variable
上面示例的改进版本可能如下所示:
data = {}
key = 'x'
data[key] = 1
print('Outside', data['x'], 'x' in data)
def f(data):
print('Inside', data['x'], 'x' in data)
f(data)
当然'x'
,您可以使用自己的键来代替str("var_cheeze_sum"+str(serie))
.
推荐阅读
- python-2.7 - Anaconda - Spyder 3.3.6 - Python 2.7 - 没有名为 matplotlib 的模块
- java - 每个具有单个抽象方法的接口都应该是一个函数式接口?
- tsql - SSRS-如何获得最大的支票号码和最大金额的支票日期
- javascript - 我的用户注册数据没有传递到登录路径
- javascript - 第一张幻灯片上的Slick js半幻灯片
- c - 使用 recv() 接收消息块
- c - 如何在c语言中只读取每行的前n个字符?
- c# - 除非用户登录,否则无法通过任务计划程序运行 Windows C# 控制台应用程序
- tensorflow - 我应该将@tf.function 用于所有功能吗?
- python - Python 列表参数销毁