Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 7, 2017 14:27:09

gmaksim
От: Россия
Зарегистрирован: 2017-07-17
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5 Вызов классов из метода

Есть два класса со своими методами, что при вызове одного, что при вызове другого (2 и 3) открывается свой GUI.
В основном коде вызывается функция (main) которая отображает GUI с двумя кнопками, при нажатии одной вызывается один класс (2), при нажатии другой другой (3).
И тут и появилась странная проблема, в которой никак не могу разобраться:
Из основного GUI (1) вызывается класс (2) и отображается другой GUI, а при нажатии на другую кнопку, класс выполняется (3), но ничего графически не отображается, просто завершается класс.
При этом, если по-умолчанию при старте программы, просто сразу вызывать класс (3), то тогда GUI отображается.

Отредактировано gmaksim (Сен. 7, 2017 14:33:13)

Офлайн

#2 Сен. 7, 2017 14:32:34

gmaksim
От: Россия
Зарегистрирован: 2017-07-17
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5 Вызов классов из метода

Схематично примерно так.

Прикреплённый файлы:
attachment 1.png (23,0 KБ)

Офлайн

#3 Сен. 12, 2017 14:54:34

gmaksim
От: Россия
Зарегистрирован: 2017-07-17
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5 Вызов классов из метода

Боже, какой же “сложный” вопрос, что даже местные тролли не снизошли до шуток!
Ужас.

Офлайн

#4 Сен. 12, 2017 15:26:30

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

PyQt5 Вызов классов из метода

Грех смеяться над убогими… А если серьёзно, то вместо того что-бы писать про окна “1”, “2”, “3” и картинку надо было код выложить. Без него никто тратить время не будет.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Сен. 12, 2017 15:48:48

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

PyQt5 Вызов классов из метода

gmaksim
Есть два класса…
не удержался



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#6 Сен. 12, 2017 15:55:25

gmaksim
От: Россия
Зарегистрирован: 2017-07-17
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5 Вызов классов из метода

Rodegast
Грех смеяться над убогими…
Такое огромное ЧСВ развилось после освоения Python или вы так всю жизнь страдаете ?
Rodegast
А если серьёзно, то вместо того что-бы писать про окна “1”, “2”, “3” и картинку надо было код выложить. Без него никто тратить время не будет.
Да я понимаю, но код ушел за тысячу строк (не думаю что кто-то будет тут сидеть и изучать его “за так”) и реализация задач выполнена скорее всего не лучшим образом, поэтому мой вопрос был больше к теоретической части и возможно у кого-то была схожая проблема, так сказать подвели бы к мысли.

Офлайн

#7 Сен. 12, 2017 16:03:08

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

PyQt5 Вызов классов из метода

gmaksim
мой вопрос был больше к теоретической части и возможно у кого-то была схожая проблема, так сказать подвели бы к мысли.
Тут как раз дело в реализации, выкинте из кода все лишнее, потому как в теории как раз все работает..
вот нарыл у себя пример На котором я чтото обьснял Куруму: тоже два разных класса которые вызываются из одного главного окна:
 from PyQt4 import  QtCore,QtGui
import sys
class Test(QtGui.QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setWindowTitle('...test')
        self.show()
class Begin(QtGui.QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setWindowTitle('BEGIN.....')
        self.show()
class MyWindow(QtGui.QWidget):
    def __init__(self):
        super(MyWindow, self).__init__()
        btn1=QtGui.QPushButton(self, text='test')
        btn1.clicked.connect(self.test)
        btn2=QtGui.QPushButton(self, text='begin')
        btn2.clicked.connect(self.begin)
        self.grid = QtGui.QGridLayout()
        self.setLayout(self.grid)
        self.grid.addWidget(btn1,0,0)
        self.grid.addWidget(btn2,0,1)
        self.show()
    def test(self):
        self.a = Test()
    def begin(self):
        self.a = Begin()
if __name__ == '__main__':
    app1 = QtGui.QApplication(sys.argv)
    window = MyWindow()
    sys.exit(app1.exec())
Все окна вызываються в любой последовательности, нужно смотреть именно вашу реализацию.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Сен. 12, 2017 16:04:16)

Офлайн

#8 Сен. 12, 2017 16:08:50

gmaksim
От: Россия
Зарегистрирован: 2017-07-17
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5 Вызов классов из метода

Если выдернуть из контекста, то примерно так:

 from PyQt5.QtWidgets import \
    (QWidget, QPushButton, QApplication, QLabel, QComboBox, QLineEdit, QGridLayout, QMessageBox, QListWidget)
from PyQt5.QtCore import Qt
class one(QWidget):
    def __init__(self):
        super().__init__()
        # ...
        self.start()
    def start(self):
        self.layout = QGridLayout()
        self.setLayout(self.layout)
        self.setGeometry(100, 100, 600, 500)
        # ...
        self.show()
class two(QWidget):
    def __init__(self):
        super().__init__()
        # ...
        self.start()
    def start(self):
        self.layout = QGridLayout()
        self.setLayout(self.layout)
        self.setGeometry(100, 100, 600, 500)
        # ...
        self.show()
def main():
    app = QApplication(sys.argv)
    def start1():
        s1 = one()
    def start2():
        s2 = two()
    root = QWidget()
    root.layout = QGridLayout()
    root.setLayout(root.layout)
    root.setGeometry(100, 100, 600, 500)
    # ...
    root.butt = QPushButton(text='start 1')
    root.butt.clicked.connect(start1)
    root.layout.addWidget(root.butt, 1, 1)
    root.butt = QPushButton(text='start 2')
    root.butt.clicked.connect(start2)
    root.layout.addWidget(root.butt, 2, 1)
    root.show()
    sys.exit(app.exec_())
if __name__ == "__main__":
    main()
Собственно класс one (добавление в БД) запускается, класс two (просмотр из БД) - нет (точнее мельком открывается окно и пропадает, как-будто все отработало и все (пробовал ставить input и прочее), на работу gc не похоже).
Если в main сразу вызывать two - запускается. Во всех остальных вариантах - нет.
p.s. Подозреваю, что такая задача делается проще и не так криво.

Отредактировано gmaksim (Сен. 12, 2017 16:14:31)

Офлайн

#9 Сен. 12, 2017 16:09:21

gmaksim
От: Россия
Зарегистрирован: 2017-07-17
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5 Вызов классов из метода

PEHDOM
Тут как раз дело в реализации, выкинте из кода все лишнее, потому как в теории как раз все работает..
вот нарыл у себя пример На котором я чтото обьснял Куруму: тоже два разных класса которые вызываются из одного главного окна:
Сейчас изучу, спасибо.

Офлайн

#10 Сен. 12, 2017 16:21:09

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

PyQt5 Вызов классов из метода

gmaksim
Если выдернуть из контекста, то примерно так:
У меня вообще ни одно окно не создаеться из вашего примера.
М-да, как раз пример мой кстати пришелся, сам того не зная. На нем я показывал Куруму( или комуто еще), что в пайтоне любой обьект храниться в памяти ровно до тех пор пока на него существует хотябы одна ссылка.
У вас s1 = one() и s2 = two() существуют исключительно в локальной видимости функций start1 и start2, соответвенно окно создается, и существует ровно до тех пор пока отрабатывают эти функции. Функция отработала, локальная переменная s1, например, указывающая на окно класса one() более не существует, других указателей на окно нет, сборщик мусора освобождает память занимаемую оьтектом-окном.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Сен. 12, 2017 16:22:45)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version