我正在编写一个程序,该程序使用基本名称以及诸如id和series之类的变量来生成变量。
我使用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'
答案 0 :(得分:1)
您位于函数内部,因此位于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()
中的键。
也:Why are global variables evil?
您为什么首先选择使用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))
。