Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
5 / 5 / 0
Регистрация: 19.05.2018
Сообщений: 193
1

Создание экземпляра класса внутри другого класса

16.12.2018, 18:17. Показов 4000. Ответов 1

Author24 — интернет-сервис помощи студентам
Добрый вечер.
Стоит задача сделать поле ввода с валидацией данных. Нужно чтобы пользователь не мог ввести более 1 символа в поле. И чтобы фокус этого поля ввода переместился на соседнее.
Я понимаю что нужно создать класс кастомного edit размерами 1 х 1 символ.
Потом внутри класса прописать валидацию данных, чтобы пользователь не мог ввести больше 1 символа в клетку - подскажите как это сделать. Ладно с логикой, хочу хотя бы GUI докрутить.
Я создал класс, напишу со своими избыточными комментариями, т.к. пытаюсь качественно ПОНЯТЬ как это работает и чтобы мне указали на ошибки.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class custom_edit: #объявляем класс без предварительно заданных параметров
    def __init__(self, master): #вызываем конструктор. В него передаем первый аргумент SELF 
                                           #относящийся непосредственно к создаваемому элементу т.е. будущему edit` у
                                           # затем указываем контейнер, в котором элемент будет размещаться, в этом случае контейнер 
                                           #Tk.frame 
        frame=frame(master) #задается переменная frame, к-рая назначается мастером, т.е. контейнером, содержащим эл-т 
        frame.pack() #вызываем упаковщик pack(). По умолчанию он задает side = "top". (Технически этот контейнер скорее всего 
                            #упаковывается в какой-нибудь другой виртуальный или "нулевой" контейнер? или это делается по другим 
                            #причинам) фактически, контейнер сам подтянется под размер создаваемого элемента ? 
        #self.edit=Text(master, width=1, height=1, font=f2) #объявляется сам кастомный эдит, который наследуется
                                                                                      #от базового класса Tk.Text, ему передаются параметры (или 
                                                                                      #аргументы? или атрибуты? или опции? как правильно и в чем их 
                                                                                      #отличие друг от друга? поэтому я точно не могу понять, указывать 
                                                                                      #здесь [B]frame[/B] или [B]master[/B]) 
        self.edit=Text(frame, width=1, height=1, font=f2) #в качестве первого элемента задан контейнер, в который этот эдит 
                                                                                  #должен упаковаться, ну и, непосредственно, передаются параметры 
                                                                                  #настройки GUI этого компонента 
        self.edit.pack() # пакуем эдит в контейнер, который назначен первым аргументом
Теперь я хочу создать экземпляр класса получившегося поля ввода. Чтобы это выглядело как клеточки, с некоторым расстоянием. Логически я понимаю что нужно применить упаковщик grid и там задать кол-во столбцов и строк. При этом контейнер, внутри которого я хочу эти Edit` ы красиво в ряд выстроить - принадлежит к форме, описанной внутри класса.
Вопрос в том КАК мне создать экземпляр класса custom_edit() внутри другого класса?

фрагмент кода класса, внутри которого я хочу создать экземпляр эдита:
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
class Window1:
    def __init__(self, master):
        self.master=master
        self.master.resizable(0, 0)
        self.master.title('Ввод исходных данных Шаг 1/6')
        self.master.geometry('%dx%d+%d+%d' %
                (XRes,YRes,
                (ClientWidth-XRes)/2,(ClientHeight-YRes)/2-20))
        self.master.config(bg='yellow')
        self.frame=Frame(self.master)
        self.frame.pack()
#===================================================
        self.h22 = Frame(self.master, width=XRes/2, height=125, bg=palegreen000)
        self.h22.place(x=XRes/2,y=91)
        self.h22_1 = Frame(self.h22, width=135, height=25, bg='yellow')
        self.h22_1.place(x=8,y=45)
#===================================================
#встраивание полей ввода в подготовленные области
        DOEd1=custom_edit(self.h22_1)
        DOEd2=custom_edit(self.h22_1)
        DOEd3=custom_edit(self.h22_1)
        DOEd4=custom_edit(self.h22_1)
        DOEd5=custom_edit(self.h22_1)
        DOEd6=custom_edit(self.h22_1)
        
        DOEd1.grid(row=0, column=0)
        DOEd2.grid(row=0, column=1)
        DOEd3.grid(row=0, column=2)
        DOEd4.grid(row=0, column=3)
        DOEd5.grid(row=0, column=4)
        DOEd6.grid(row=0, column=5)
Как мне правильно создать экземпляры класса, чтобы полученные элементы в окне расположились как на скриншоте.
Миниатюры
Создание экземпляра класса внутри другого класса   Создание экземпляра класса внутри другого класса  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2018, 18:17
Ответы с готовыми решениями:

Как можно изменить атрибут экземпляра одного класса при добавлении/изменении экземпляра другого класса
Мне нужно, чтобы при создании города/деревни уже существующей области (т.е. уже создана область с...

numba jit внутри класса, либо с обращением к атрибутам экземпляра
Здравствуйте! Прошу прощения, если пишу не в том разделе. Есть написанная программа, в...

Получить имя класса через параметр экземпляра этого класса
Добрый день! Подскажите пожалуйста можно ли получить имя класса при обращении к параметру...

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

Как обратиться к значениям переменной одного класса из метода другого класса
Есть переменная - Холодильник1 класса Freezer Холодильник1 = Freezer() Холодильник2 =...

1
5 / 5 / 0
Регистрация: 19.05.2018
Сообщений: 193
16.12.2018, 18:59  [ТС] 2
Возникающая ошибка:
Traceback (most recent call last):
File "C:/Users/Vladimir/Desktop/python/^^^^PROJECT/5 window.py", line 382, in <module>
main()
File "C:/Users/Vladimir/Desktop/python/^^^^PROJECT/5 window.py", line 46, in main
app=Window1(root)
File "C:/Users/Vladimir/Desktop/python/^^^^PROJECT/5 window.py", line 161, in __init__
DOEd1=custom_edit(self.h22_1)
File "C:/Users/Vladimir/Desktop/python/^^^^PROJECT/5 window.py", line 50, in __init__
frame=frame(master)
UnboundLocalError: local variable 'frame' referenced before assignment


Добавлено через 29 минут
Пытаюсь побороть эту ошибку. Вроде бы что-то начало проясняться.
Если в классе мы просто создаем объект, без контейнера и при создании экземпляра класса указываем родительский контейнер, в котором этот экземпляр будет размещен?

Python
1
2
3
4
5
6
class custom_edit(object):
    def __init__(self, master=None):
        #frame=Tk.frame(master)
        #frame.pack()
        self.ed=Text(master, width=1, height=1, font=f2)
        self.ed.pack()
Как нужно изменить строку с созданием экземпляра, чтобы задумка (если она правильная) сработала?
Сейчас возникает ошибка другого плана.
Traceback (most recent call last):
File "C:/Users/Vladimir/Desktop/python/^^^^PROJECT/5 window.py", line 384, in <module>
main()
File "C:/Users/Vladimir/Desktop/python/^^^^PROJECT/5 window.py", line 46, in main
app=Window1(root)
File "C:/Users/Vladimir/Desktop/python/^^^^PROJECT/5 window.py", line 160, in __init__
DOEd1=custom_edit(self.h22_1).grid(row=0, column=0)
AttributeError: 'custom_edit' object has no attribute 'grid'
0
16.12.2018, 18:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2018, 18:59
Помогаю со студенческими работами здесь

Что-то я не понимаю.Вызов метода одного класса из другого класса
Есть два класса первый содержит атрибуты объекта описывающие кнопку: имя, позиция, размер и тд... А...

Использование объектов одного класса в функциях другого класса
Нужно создать класс Комната и класс ДвериОкна, при этом программа должна добавлять объекты класса...

Как создать метод класса, который будет выводить на экран количество срабатываний другого класса
Я хочу чтобы можно было вызвать метод sign_in и при этом выводилось только 'Вы успешно вошли', а...

Изменить массив класса из другого класса
Добрый день. Столкнулся с такой проблемой, что при попытке изменить массив arr класса А методом...

атрибуты экземпляра класса
Добрый день Такая задачка: Объявите класс с именем Person и атрибутами: name: 'Сергей...

Переделка экземпляра класса
- Доброго времени суток Всем! - Очень мало работал с классами Python. Помогите, пожалуйста, в...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru