获取“关键错误:var_cheeze_value11”

时间:2019-06-03 21:45:23

标签: python tkinter

我正在编写一个程序,该程序使用基本名称以及诸如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'

1 个答案:

答案 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))