首页 > 解决方案 > 获取“关键错误: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'

标签: pythontkinter

解决方案


您在函数内部,因此在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)).


推荐阅读