Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/35: Рейтинг темы: голосов - 35, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 21.11.2016
Сообщений: 42

Обращение к объектам, созданным в другой функции класса и являющимися объектами GUI

16.07.2019, 00:26. Показов 8235. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Товарищи, профи, приветствую Вас.
Я совсем новичок, потому прошу помощи.
Пишу по примеру, переделывая, так что прошу сильно се серчать за качество.

Начало выглядит так:
Python
1
2
3
4
5
6
7
#!/usr/bin/python
# coding=utf-8
 
import sys
#from qt import *
from PyQt5 import QtWidgets, QtGui, QtCore, Qt
from PyQt5.QtWidgets import *
создал main:
Python
1
2
3
if __name__ == "__main__":
    app = HelloApplication(sys.argv)
    sys.exit(app.exec_())
Создал класс:
Python
1
2
3
4
class HelloApplication(QApplication):
    def __init__(self, args):
        QApplication.__init__(self,args)
        self.addWidgets()
В классе создал процедуру init:
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
    def addWidgets(self):
        self.BaseWidget=QWidget()
        grid = QGridLayout()
        editLine=QLineEdit()
        addButton=QPushButton("Add")
        deleteButton = QPushButton("Delete")
        listView=QListView()
 
        editLine.setMinimumWidth(250)
        addButton.setFixedWidth(80)
        deleteButton.setFixedWidth(80)
        listView.setModelColumn(2)
        listViewmodel = QtGui.QStandardItemModel(listView)
 
        grid.addWidget(editLine, 0, 0, 1, 2)
        grid.addWidget(addButton, 0, 2, 1, 1)
        grid.addWidget(listView, 1, 0, 3, 3)
        grid.addWidget(deleteButton, 4, 2, 1, 1)
 
        listView.setWindowTitle('Example List')
 
        self.addrowinlistView("пиво")
 
        listView.setModel(listViewmodel)
        self.BaseWidget.setLayout(grid)
        self.BaseWidget.show()
Хотел бы сделать первичное наполнение ListView через отдельную функцию:
Python
1
self.addrowinlistView("пиво")
А вот и сама функция:
Python
1
2
3
4
5
6
7
8
9
    def addrowinlistView(self,*rowsforadd):
        for i in rowsforadd:
            # Create an item with a caption
            item = QtGui.QStandardItem()
            # Add a checkbox to it
            item.setCheckable(True)
            # Add the item to the model
            listViewmodel.appendRow(item)
            #self.BaseWidget.listViewmodel.appendRow(item)

И ВОТ ИМЕННО В ПОСЛЕДНЕЙ ЧАСТИ И ВОЗНИКЛИ ПРОБЛЕМЫ И МОЙ ВОПРОС.

Сначала компилятор начал ругаться на
Python
1
item = QtGui.QStandardItem()
, я попытался перенести это в первую функцию. Потом он начал ругаться и на строку
Python
1
listViewmodel.appendRow(item)
.
Здесь я растерялся от собственной безграмотности.
Итак вопрос. Как правильно из функции addrowinlistView обращаться к объектам, созданным в addWidgets?

Спасибо за помощь и учёбу!

P.S. На всякий случай, код целиком:
Кликните здесь для просмотра всего текста
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/python
# coding=utf-8
 
import sys
#from qt import *
from PyQt5 import QtWidgets, QtGui, QtCore, Qt
from PyQt5.QtWidgets import *
 
class HelloApplication(QApplication):
    def __init__(self, args):
        """
            В конструкторе мы делаем всё, что необходимо для запска нашего приложения, которое
            создаёт QApplication в __init__ методе, затем добваляет наши виджеты и, наконец,
            запускает exec_loop
        """
        QApplication.__init__(self,args)
        self.addWidgets()
 
    def addWidgets(self):
        self.BaseWidget=QWidget()
        grid = QGridLayout()
        editLine=QLineEdit()
        addButton=QPushButton("Add")
        deleteButton = QPushButton("Delete")
        listView=QListView()
 
        editLine.setMinimumWidth(250)
        addButton.setFixedWidth(80)
        deleteButton.setFixedWidth(80)
        listView.setModelColumn(2)
        listViewmodel = QtGui.QStandardItemModel(listView)
 
        grid.addWidget(editLine, 0, 0, 1, 2)
        grid.addWidget(addButton, 0, 2, 1, 1)
        grid.addWidget(listView, 1, 0, 3, 3)
        grid.addWidget(deleteButton, 4, 2, 1, 1)
 
        listView.setWindowTitle('Example List')
 
       #self.addrowinlistView(
       #    'Cookie dough',  # Must be store-bought
       #    'Hummus',  # Must be homemade
       #    'Spaghetti',  # Must be saucy
       #    'Dal makhani',  # Must be spicy
       #    'Chocolate whipped cream'  # Must be plentiful
       #)
        self.addrowinlistView("пиво")
 
        listView.setModel(listViewmodel)
        self.BaseWidget.setLayout(grid)
        self.BaseWidget.show()
 
    def addrowinlistView(self,*rowsforadd):
        for i in rowsforadd:
            # Create an item with a caption
            item = QtGui.QStandardItem()
            # Add a checkbox to it
            item.setCheckable(True)
            # Add the item to the model
            listViewmodel.appendRow(item)
            #self.BaseWidget.listViewmodel.appendRow(item)
 
if __name__ == "__main__":
    app = HelloApplication(sys.argv)
    sys.exit(app.exec_())
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.07.2019, 00:26
Ответы с готовыми решениями:

Обращение к динамически созданным объектам Qt
Доброго времени суток. У меня возникла необходимость в диалоговом окне по нажатию на кнопку создавать textedit'ы, в них пользователь пишет...

Обращение к динамически созданным объектам
Доброго времени суток. Есть меню формы - MainMenu1. В одной из вкладок динамически создаются кнопки, по нажатию на которые...

Обращение к динамически созданным объектам
Подскажите возможно ли получить список элементов созданных в TabControl и обращаться к ним? суть проблемы в том, что мне нужно обратиться к...

25
Эксперт Python
 Аватар для dondublon
4663 / 2082 / 367
Регистрация: 17.03.2012
Сообщений: 10,203
Записей в блоге: 6
15.10.2021, 14:46
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от VKont Посмотреть сообщение
А каким это образом вы соберёте гуй в одну кучу? Например, в программе пять окон, в каждом окне имеются свои элементы (батоны, лэйблы, комбо и т.д.), какие-то из них могут быть взаимосвязаны. Например, если в одном окне поменял статус одного элемента, то соответственно в другом окне согласно их взаимосвязи также произошли изменения в элементах.
А вот уметь надо
Прежде всего, вам надо понять, что программа состоит не только из гуя. И взаимосвязи элементов гуя быть не должно.
Что в настоящих программах не такие связи:
Code
1
gui_object1 -> gui_object_2
А такие:
Code
1
gui_object1 -> logic_object_1 -> logic_object_2 -> gui_object_2
При этом logic_object_x может вообще не знать про гуй. И быть использован, к примеру, с другим гуём или вообще без оного.
Ну а как конкретно это сделать - вопрос объемный, так сразу не расскажешь.

Добавлено через 3 минуты
Да, насчёт куч. gui_objects в одной куче, logic_objects - в другой. Вторая куча не знает про гуй вообще. То есть не только про конкретно ваш, а вообще, там нет таких импортов. В первой, разумеется, есть.

Добавлено через 4 минуты
Цитата Сообщение от VKont Посмотреть сообщение
В этом и заключается их суть, что глобалки они всегда находятся в памяти и не выгружаются до конца работы программы или до получения соответствующей команды от программы.
Не совсем. Глобалки - это не про время нахождения в памяти, а про доступность. И, конечно, такой доступности быть не должно, за исключением вещей типа QApplication\TApplication и т. п.
Цитата Сообщение от VKont Посмотреть сообщение
остальные четыре не активны и по сути они выгружены из памяти, а разные элементы принадлежат только одному своему родителю окну. Как без глобальных/публичных объявлений
Вы серьёзно?
У вас четыре окна, на каждом, допустим, 10 элементов, и их вы собираетесь делать глобальными? 40 элементов - вы же сразу запутаетесь, это очевидно.
0
11 / 11 / 0
Регистрация: 07.10.2016
Сообщений: 196
15.10.2021, 15:20
Цитата Сообщение от dondublon Посмотреть сообщение
Не совсем. Глобалки - это не про время нахождения в памяти, а про доступность.
В том-то и дело - они доступны только пока находятся в озу , как только переменная или любой элемент/объект выгружен, он уже перестаёт быть доступен.

Добавлено через 56 секунд
Цитата Сообщение от dondublon Посмотреть сообщение
Вы серьёзно?
У вас четыре окна, на каждом, допустим, 10 элементов, и их вы собираетесь делать глобальными? 40 элементов - вы же сразу запутаетесь, это очевидно.
Да нет, зачем понимать так буквально-то? 40 элементов, а между собой связь есть только скажем у трех элементов, при чём связь же не между самими элементами, а свойства одного элемента выбираются в зависимости от свойства другого элемента. Неужели вы не понимаете о чём я? Сколько программ действующих вы написали в своей жизни? (можете не отвечать)
0
Эксперт Python
 Аватар для dondublon
4663 / 2082 / 367
Регистрация: 17.03.2012
Сообщений: 10,203
Записей в блоге: 6
15.10.2021, 15:48
Цитата Сообщение от VKont Посмотреть сообщение
В том-то и дело - они доступны только пока находятся в озу , как только переменная или любой элемент/объект выгружен, он уже перестаёт быть доступен.
Нет. Доступность - это про область видимости.

Цитата Сообщение от VKont Посмотреть сообщение
Неужели вы не понимаете о чём я?
Ну я что вижу, о том и пою.

Цитата Сообщение от VKont Посмотреть сообщение
Сколько программ действующих вы написали в своей жизни? (можете не отвечать)
Спасибо, что можно не отвечать. А то я мог бы и ответить.

На этом разрешите откланяться. Материала для размышления я написал вполне достаточно.
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
15.10.2021, 15:55
Цитата Сообщение от VKont Посмотреть сообщение
Как без глобальных/публичных объявлений тогда можно осуществить взаимосвязь?
Qt это фрейморвк основанный на сигналах. Все элементы способны общаться между собой посредством своего рода почтовых сообщений.
Процитирую:
Для работы с событиями PyQt5 имеет уникальный механизм сигналов и слотов. Сигналы и слоты используются для связи между объектами.
Таким образом GUI-пись на Qt кардинально отличается от подобной в VB. Поэтому здесь все на классах.

Ну а встроенный tkinter, конечно, далек от возможностей Qt, поэтому юзается, в основном, для мелких учебных программок, либо очень простых окошек.
На ткинтере можно ваять и дедовским способом... но недолго :-)

Добавлено через 6 минут
Цитата Сообщение от VKont Посмотреть сообщение
как только переменная или любой элемент/объект выгружен
В каких таких языках переменные куда-то там выгружаются?
Память выделенная под объект возвращается системе только после завершения приложения, либо когда на объект не осталось ссылок (уборка мусора GC), либо когда мы вручную освободили эту память (в тех языках где это возможно - не в Python)
0
11 / 11 / 0
Регистрация: 07.10.2016
Сообщений: 196
15.10.2021, 16:34
Цитата Сообщение от Garry Galler Посмотреть сообщение
Qt это фрейморвк основанный на сигналах. Все элементы способны общаться между собой посредством своего рода почтовых сообщений.
Я вот даже ничего не утверждаю за Python, ну не знаю я его, вот одну софтинку самую наипростейшую только написал, используя tkinter, просто потому, что другие модули установить не получилось, т. к. нет возможности скачать их на рабочую машину.

Цитата Сообщение от Garry Galler Посмотреть сообщение
В каких таких языках переменные куда-то там выгружаются?
Здесь имеется ввиду выгрузка из памяти. Да, это действительно так и называется, выгрузка. К примеру, графическое окно программы можно просто закрыть, т. е. скрыть его с экрана, когда пользователь его не будет видеть на рабочем столе (метод hide), но оно будет сохраняться в памяти и в любой момент его можно снова отобразить (метод show) и когда можно полностью выгрузить, т. е. очистить память от окна и его компонентов, тогда чтобы его снова открыть, придется заново загрузить его в память. Ну вы понимаете разницу между этими действиями.

В общем это, конечно, очень интересно общаться на близкие нам по духу и занятию темы, но мы как-то плавно отвлеклись от основной темы. Ладно я буду пробовать следующую программу писать, создавая GUI через классы, надеюсь у меня всё получится и потом обязательно сообщу результат, чего я не догнал сразу и почему тут из-за этого всё так затянулось в общении. Всем спасибо за свои мысли, за сотрудничество, это очень здорово, когда люди знающие и понимающие поддерживают диалог, а то порой что-то спросишь и ни ответа, ни привета.
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
15.10.2021, 16:54
Цитата Сообщение от VKont Посмотреть сообщение
Я вот даже ничего не утверждаю за Python
QT это не Python. Qt это кроссплатформеный (написанный на С++) GUI стандарт для большинства современных ЯП.
PyQT всего лишь обертка этой библиотеки для Python.

Я наивно думал, что и в VB сейчас Qt юзают. Оказывается, нет?

Добавлено через 5 минут
Цитата Сообщение от VKont Посмотреть сообщение
Ну вы понимаете разницу между этими действиями
Я не знаю такого механизма.
Отдельные графические объекты, по моему, никуда не выгружаются. То, что они скрыты от пользователя, никак не освобождает занятую ими память. Выгрузить из памяти можно процесс (так делают браузеры скидывая на диск вкладки целиком, чтобы освободить ОЗУ).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.10.2021, 16:54

Обращение к динамически созданным объектам
Здравствуйте. Создаю динамически кнопки с текстом, который хранится в массиве Info. На форме также есть lineEdit. Когда я пишу туда...

Обращение к динамически созданным объектам
Я динамически создаю текстовые поля (PlainTextEdit) с именами по типу name+айди_из_БД (name1, name2 и т.д). В другом слоте мне нужно...

Обращение к динамически созданным на форме объектам
Добрый день. Я динамически создаю по нажатию кнопки на форме разные элементы: comboBox, textBox, label. Создаю вот так: var cb1 = new...

Обращение к объектам класса
Привет, всем. Пожалуйста, объясните в чем ошибка: TestPr.javapublic class TestPr { /** * @param args the command line...

Обращение к объектам в функции
Хочу передать ссылку на внешнюю книгу фунции. Получаю ошибку ByRef argument mismatch. Подскажите пожалуйста. Как область видимости...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru