Получение «ключевой ошибки: var_cheeze_value11» - PullRequest
1 голос
/ 04 июня 2019

Я создаю программу, которая создает переменные с базовым именем и переменными, такими как их 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'

1 Ответ

1 голос
/ 04 июня 2019

Вы находитесь внутри функции и, следовательно, вне того же пространства имен, где 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: Использование vars () для присвоения строки переменной

Улучшенная версия приведенного выше примера может выглядеть следующим образом:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...