3 / 3 / 2
Регистрация: 27.09.2009
Сообщений: 46
1

Получение значений переменных в классах

22.07.2015, 20:40. Показов 1159. Ответов 1
Метки нет (Все метки)

Столкнулся с таким вопросом. Функция adobj в классе Add обращается к внешней функции zap, передавая в нее две переменных. Из функции zap в adobj возвращается переменная К, которой присваивается значение словаря.
Вопрос. Когда аналогичные процессы проворачивались без использования классов, все работало прекрасно. Как только появилось получение значения путем
Python
1
name = self.name2.get()
при попытке вызвать name, в случае - если name - значение словаря, приводит к ошибке:

Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/shelve.py", line 111, in __getitem__
value = self.cache[key]
KeyError: '1'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/tkinter/__init__.py", line 1533, in __call__
return self.func(*args)
File "/Users/rust-resisting/Desktop/Untitled2.py", line 138, in adobj
zap(obj,name)
File "/Users/rust-resisting/Desktop/Untitled2.py", line 58, in zap
k=file[name]
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/shelve.py", line 113, in __getitem__
f = BytesIO(self.dict[key.encode(self.keyencoding)])
KeyError: b'1'

Пример кода:


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Add(Frame):
    def __init__(self,master):
        super(Add,self).__init__(master)
        self.grid()
        self.create_widgets()
    def create_widgets(self):
        
        Label(self,text="Имя:").grid(row=0,column=0,sticky=W)
        self.zak = Entry(self)
        self.zak.grid(row=1,column=0,sticky=W)
        
        self.otpr = Button(self,text="Добавить",command=self.doba)
        self.otpr.grid(row=2,column=0,sticky=W)
 
    def doba(self):
        name = self.zak.get()
        file = shelve.open("file.dat","c")
        if name not in file:
            Label(self,text="Объект:").grid(row=4,column=0,sticky=W)
            self.obj=Entry(self)
            self.obj.grid(row=5,column=0,sticky=W)
            self.otpr = Button(self,text="Добавить",command=self.adobj)
            self.otpr.grid(row=6,column=0,sticky=W)
            file.close()
 
    def adobj(self):
        obj=self.zak.get()
        name = self.zak.get()
        k=zap(obj,name)
        self.otvet = Text(self,width=35,height=5,wrap=WORD)
        self.otvet.grid(row=7,column=0,columnspan=2,sticky=W)
        self.otvet.insert(0.0,k)
Кусок кода из функции ZAP(obj,name):

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   
    file = shelve.open("file.dat","c")
    n = []
    for i in file:
        for a in file[i]:
            n.append(a)
    file.close()
    num0 = len(n)+1
    kv = kva()
    year = yea()
    kv = str(kv)
    year = str(year)
    num0 = str(num0)
    num = num0+"-"+kv+"-"+year
    dog = 0
    dat=[num,obj,dog]
    file = shelve.open("file.dat","c")
    k=file[name]
    return k
Я так понимаю, что при вызове значения через
Python
1
name = self.name2.get()
возвращается не строка?

Помогите, пожалуйста

Добавлено через 1 час 18 минут
Упростил кусок кода.
Задам вопрос проще - почему вылетает ошибка (указана выше) в коде:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import os, shelve, datetime,pickle
from tkinter import*
 
 
 
 
class Add(Frame):
    def __init__(self,master):
        super(Add,self).__init__(master)
        self.grid()
        self.create_widgets()
        
    def create_widgets(self):
 
        Label(self,text="Название объекта").grid(row=4,column=0,sticky=W)
        self.obj=Entry(self)
        self.obj.grid(row=5,column=0,sticky=W)
        self.otpr = Button(self,text="Добавить",command=self.adobj)
        self.otpr.grid(row=6,column=0,sticky=W)
 
    def adobj(self):
        name = self.obj.get()
        a = {}
        file = shelve.open("1.dat")
        file['a'] = [1,2,3]
        file.sync()
        file.close()
        file = shelve.open("1.dat","c")
        nn = file[name]
        self.otvet = Text(self,width=35,height=5,wrap=WORD)
        self.otvet.grid(row=7,column=0,columnspan=2,sticky=W)
        self.otvet.insert(0.0,nn)
 
        
root = Tk()
root.title("v.1.0")
root.geometry("220x250")
app = Add(root)
root.mainloop()
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.07.2015, 20:40
Ответы с готовыми решениями:

Вывод значений переменных в двух разных классах
Доброго времени суток.По заданию необходимо создать переменные со спецификаторами public и...

Получение значений переменных сред
Приветы всем. Помогите найти решение или объяснение, ситуация такая, нужно узнать две переменные...

Получение первых строк двух файлов в переменные и сравнение значений этих переменных
Приветствую... Народ прошу помогите написать бат программу...я бы и сам написал, но знаю только...

получение значений переменных из файла при возврате Activity на экран. правильно ли я поступаю ?
Имеется основное Activity приложения, которое ранее было перекрыто другим Activity (настройками),...

1
2732 / 2335 / 620
Регистрация: 19.03.2012
Сообщений: 8,832
22.07.2015, 20:44 2
rust-resisting, Потому что в файле нет ничего такого под таким ключом.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.07.2015, 20:44
Помогаю со студенческими работами здесь

Приравнивание переменных в классах.
Почему нельзя в классе сразу после объявления переменной прировнять её к определенному значению?...

Получение информации о классах в C#
Помогите найти способ решения. Учу C# не так давно. Стоит задача разработать Windows-приложение,...

Получение информации о классах
В пространстве имён System.Reflection есть классы FieldInfo, MethodInfo, PropertyInfo и т. д. Я...

Использование переменных в других классах
public class povremennaya : Form1 { public double stavka1; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru