Найти - Пользователи
Полная версия: PyQt5 Вызов классов из метода
Начало » Python для новичков » PyQt5 Вызов классов из метода
1 2
gmaksim
Есть два класса со своими методами, что при вызове одного, что при вызове другого (2 и 3) открывается свой GUI.
В основном коде вызывается функция (main) которая отображает GUI с двумя кнопками, при нажатии одной вызывается один класс (2), при нажатии другой другой (3).
И тут и появилась странная проблема, в которой никак не могу разобраться:
Из основного GUI (1) вызывается класс (2) и отображается другой GUI, а при нажатии на другую кнопку, класс выполняется (3), но ничего графически не отображается, просто завершается класс.
При этом, если по-умолчанию при старте программы, просто сразу вызывать класс (3), то тогда GUI отображается.
gmaksim
Схематично примерно так.
gmaksim
Боже, какой же “сложный” вопрос, что даже местные тролли не снизошли до шуток!
Ужас.
Rodegast
Грех смеяться над убогими… А если серьёзно, то вместо того что-бы писать про окна “1”, “2”, “3” и картинку надо было код выложить. Без него никто тратить время не будет.
PEHDOM
gmaksim
Есть два класса…
не удержался
gmaksim
Rodegast
Грех смеяться над убогими…
Такое огромное ЧСВ развилось после освоения Python или вы так всю жизнь страдаете ?
Rodegast
А если серьёзно, то вместо того что-бы писать про окна “1”, “2”, “3” и картинку надо было код выложить. Без него никто тратить время не будет.
Да я понимаю, но код ушел за тысячу строк (не думаю что кто-то будет тут сидеть и изучать его “за так”) и реализация задач выполнена скорее всего не лучшим образом, поэтому мой вопрос был больше к теоретической части и возможно у кого-то была схожая проблема, так сказать подвели бы к мысли.
PEHDOM
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())
Все окна вызываються в любой последовательности, нужно смотреть именно вашу реализацию.
gmaksim
Если выдернуть из контекста, то примерно так:
 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
PEHDOM
Тут как раз дело в реализации, выкинте из кода все лишнее, потому как в теории как раз все работает..
вот нарыл у себя пример На котором я чтото обьснял Куруму: тоже два разных класса которые вызываются из одного главного окна:
Сейчас изучу, спасибо.
PEHDOM
gmaksim
Если выдернуть из контекста, то примерно так:
У меня вообще ни одно окно не создаеться из вашего примера.
М-да, как раз пример мой кстати пришелся, сам того не зная. На нем я показывал Куруму( или комуто еще), что в пайтоне любой обьект храниться в памяти ровно до тех пор пока на него существует хотябы одна ссылка.
У вас s1 = one() и s2 = two() существуют исключительно в локальной видимости функций start1 и start2, соответвенно окно создается, и существует ровно до тех пор пока отрабатывают эти функции. Функция отработала, локальная переменная s1, например, указывающая на окно класса one() более не существует, других указателей на окно нет, сборщик мусора освобождает память занимаемую оьтектом-окном.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB