Форум сайта python.su
0
PEHDOMТам совсем “вытащил из контекста”, вряд ли это запуститься в таком виде.
У меня вообще ни одно окно не создаеться из вашего примера.
PEHDOMЭто и было первой мыслью, так как класс two - режим просмотра, как обойти это так и не догадался (возможно “костыль” в виде скрытого QLineEdit на форме?).
сборщик мусора удаляет обьект-окно из памяти.
Офлайн
294
gmaksimЗачем такие сложности?
(возможно “костыль” в виде скрытого QLineEdit на форме?).
from PyQt4.QtGui import \ (QWidget, QPushButton, QApplication, QLabel, QComboBox, QLineEdit, QGridLayout, QMessageBox, QListWidget, QMainWindow, QDialog) from PyQt4.QtCore import Qt import sys class one(QMainWindow): def __init__(self, parent=None): super().__init__(parent) # ... self.start() def start(self): self.layout = QGridLayout() self.setWindowTitle('One') self.setLayout(self.layout) self.setGeometry(20, 20, 100, 100) # ... self.show() class two(QDialog): def __init__(self, parent=None): super().__init__(parent) # ... self.start() def start(self): self.layout = QGridLayout() self.setWindowTitle('Two') self.setLayout(self.layout) self.setGeometry(20, 20, 100, 100) # ... self.show() def main(): app = QApplication(sys.argv) def start1(parent): s1 = one(parent) def start2(parent): s2 = two(parent) 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(lambda: start1(root)) root.layout.addWidget(root.butt, 1, 1) root.butt = QPushButton(text='start 2') root.butt.clicked.connect(lambda: start2(root)) root.layout.addWidget(root.butt, 2, 1) root.show() sys.exit(app.exec_()) if __name__ == "__main__": main()
from PyQt4.QtGui import \ (QWidget, QPushButton, QApplication, QLabel, QComboBox, QLineEdit, QGridLayout, QMessageBox, QListWidget) from PyQt4.QtCore import Qt import sys class one(QWidget): def __init__(self, parent=None): super().__init__(parent) # ... self.start() def start(self): self.layout = QGridLayout() self.setWindowTitle('One') self.setLayout(self.layout) self.setGeometry(20, 20, 100, 100) # ... self.show() class two(QWidget): def __init__(self, parent=None): super().__init__(parent) # ... self.start() def start(self): self.layout = QGridLayout() self.setWindowTitle('Two') self.setLayout(self.layout) self.setGeometry(20, 20, 100, 100) # ... self.show() def main(): app = QApplication(sys.argv) def start1(): root.s1 = one() def start2(): root.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()
from PyQt4.QtGui import \ (QWidget, QPushButton, QApplication, QLabel, QComboBox, QLineEdit, QGridLayout, QMessageBox, QListWidget) from PyQt4.QtCore import Qt import sys class one(QWidget): def __init__(self, parent=None): super().__init__(parent) # ... self.w = self # Держим ссылку на самих себя чтобы окно не закрылось self.start() def start(self): self.layout = QGridLayout() self.setWindowTitle('One') self.setLayout(self.layout) self.setGeometry(20, 20, 100, 100) # ... self.show() def closeEvent(self, event): self.w = None # На всякий случай при закрытии удаляем ссылку, чтобы избежать утечек. event.accept() class two(QWidget): def __init__(self, parent=None): super().__init__(parent) # ... self.start() def start(self): self.layout = QGridLayout() self.setWindowTitle('Two') self.setLayout(self.layout) self.setGeometry(20, 20, 100, 100) # ... 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()
[code python][/code]
Отредактировано PEHDOM (Сен. 12, 2017 17:33:19)
Офлайн
0
Первый способ подошел отлично, спасибо!
Единственное хотел уточнить, в реализации первого варианта, как можно сделать возврат к исходному окну (main) - если вызвать метод по нажатию кнопки внутри класса выполняющий main снова, приложение завершается и GUI не появляется (так как gc видимо уже все собрал?).
Сделать аналог “parent=” ?
Или в main включить некую проверку на наличие инициализированного QWidget и если он есть то как-то вызывать его из памяти (предварительно не допуская его выгрузку)?
Я так понимаю надо копать в сторону понимания использования “слотов” в Python.
Отредактировано gmaksim (Сен. 13, 2017 16:15:47)
Офлайн
294
gmaksimчто значит возврат? У вас оно закрываеться при открытии второго окна?
Единственное хотел уточнить, в реализации первого варианта, как можно сделать возврат к исходному окну (main)
gmaksimмлин, три раза перечитал ничего не понял… можете пояснить что вы нажимаете и где? А лучше привести простой код котороый отбражает проблему, потому как лучше один раз увидеть чем сто раз услышать…
если вызвать метод по нажатию кнопки внутри класса выполняющий main снова, приложение завершается и GUI не появляется (так как gc видимо уже все собрал?).
from PyQt4.QtGui import \ (QWidget, QPushButton, QApplication, QLabel, QComboBox, QLineEdit, QGridLayout, QMessageBox, QListWidget, QMainWindow, QDialog) from PyQt4.QtCore import Qt import sys class one(QMainWindow): def __init__(self, parent=None): super().__init__(parent) # ... self.start() parent.hide() def start(self): self.layout = QGridLayout() self.setWindowTitle('One') self.setLayout(self.layout) self.setGeometry(20, 20, 100, 100) # ... self.show() def closeEvent(self, event): self.parent().show() event.accept() class two(QDialog): def __init__(self, parent=None): super().__init__(parent) # ... self.start() def start(self): self.layout = QGridLayout() self.setWindowTitle('Two') self.setLayout(self.layout) self.setGeometry(20, 20, 100, 100) # ... self.show() def main(): app = QApplication(sys.argv) def start1(parent): s1 = one(parent) def start2(parent): s2 = two(parent) 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(lambda: start1(root)) root.layout.addWidget(root.butt, 1, 1) root.butt = QPushButton(text='start 2') root.butt.clicked.connect(lambda: start2(root)) root.layout.addWidget(root.butt, 2, 1) root.show() sys.exit(app.exec_()) if __name__ == "__main__": main()
[code python][/code]
Отредактировано PEHDOM (Сен. 13, 2017 16:30:15)
Офлайн
PEHDOMчет у меня тоже лыжи не едут
три раза перечитал ничего не понял…
from PyQt5.Qt import * class A(QFrame): def __init__(self): super().__init__() self.setWindowTitle('A') self.resize(120,30) self.move(0,10) self.show() class B(QFrame): def __init__(self): super().__init__() self.setWindowTitle('B') self.resize(120,30) self.move(0,100) self.show() class W(QWidget): def __init__(self): super().__init__() self.btnA = QPushButton('btnA') self.btnA.clicked.connect(self.clickA) self.btnB = QPushButton('btnB') self.btnB.clicked.connect(self.clickB) grid = QGridLayout(self) grid.addWidget(self.btnA) grid.addWidget(self.btnB) def clickA(self): self.a = A() def clickB(self): self.b = B() if __name__ == "__main__": app = QApplication([]) w = W() w.show() app.exec_()
Офлайн
0
Извиняюсь, если взять за пример код PEHDOM, то я имею ввиду следующее -
PEHDOMВ классе one размещена кнопка, которая (должна) возвращать нас обратно на стартовый экран (то что выводит класс main - две кнопки с выбором).from PyQt4.QtGui import \ (QWidget, QPushButton, QApplication, QLabel, QComboBox, QLineEdit, QGridLayout, QMessageBox, QListWidget, QMainWindow, QDialog) from PyQt4.QtCore import Qt import sys class one(QMainWindow): def __init__(self, parent=None): super().__init__(parent) # ... self.start() parent.hide() def start(self): self.layout = QGridLayout() self.setWindowTitle('One') self.setLayout(self.layout) self.setGeometry(20, 20, 100, 100) # ... self.show() def closeEvent(self, event): self.parent().show() event.accept() class two(QDialog): def __init__(self, parent=None): super().__init__(parent) # ... self.start() def start(self): self.layout = QGridLayout() self.setWindowTitle('Two') self.setLayout(self.layout) self.setGeometry(20, 20, 100, 100) # ... self.show() def main(): app = QApplication(sys.argv) def start1(parent): s1 = one(parent) def start2(parent): s2 = two(parent) 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(lambda: start1(root)) root.layout.addWidget(root.butt, 1, 1) root.butt = QPushButton(text='start 2') root.butt.clicked.connect(lambda: start2(root)) root.layout.addWidget(root.butt, 2, 1) root.show() sys.exit(app.exec_()) if __name__ == "__main__": main()
Отредактировано gmaksim (Сен. 14, 2017 10:28:03)
Офлайн
0
Я реализовал схожим образом как тут:
PEHDOMно по завершению функционала класса, банальный вызов main не срабатывает, ничего не отображается.from PyQt4.QtGui import \ (QWidget, QPushButton, QApplication, QLabel, QComboBox, QLineEdit, QGridLayout, QMessageBox, QListWidget, QMainWindow, QDialog) from PyQt4.QtCore import Qt import sys class one(QMainWindow): def __init__(self, parent=None): super().__init__(parent) # ... self.start() def start(self): self.layout = QGridLayout() self.setWindowTitle('One') self.setLayout(self.layout) self.setGeometry(20, 20, 100, 100) # ... self.show() class two(QDialog): def __init__(self, parent=None): super().__init__(parent) # ... self.start() def start(self): self.layout = QGridLayout() self.setWindowTitle('Two') self.setLayout(self.layout) self.setGeometry(20, 20, 100, 100) # ... self.show() def main(): app = QApplication(sys.argv) def start1(parent): s1 = one(parent) def start2(parent): s2 = two(parent) 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(lambda: start1(root)) root.layout.addWidget(root.butt, 1, 1) root.butt = QPushButton(text='start 2') root.butt.clicked.connect(lambda: start2(root)) root.layout.addWidget(root.butt, 2, 1) root.show() sys.exit(app.exec_()) if __name__ == "__main__": main()
def clear(): for i in reversed(range(root.layout.count())): root.layout.itemAt(i).widget().deleteLater()
Офлайн
имхо вы много лишнего накрутили. наследуйтесь от QDialog
from PyQt5.Qt import * class A(QDialog): def __init__(self,parent=None): QDialog.__init__(self,parent) self.setWindowTitle('A') self.resize(120,30) self.move(0,10) class B(QFrame): def __init__(self,parent=None): QFrame.__init__(self,parent) self.setWindowTitle('B') self.resize(120,30) self.move(0,100) self.show() class W(QWidget): def __init__(self): super().__init__() self.btnA = QPushButton('btnA') self.btnA.clicked.connect(self.clickA) self.btnB = QPushButton('btnB') self.btnB.clicked.connect(self.clickB) grid = QGridLayout(self) grid.addWidget(self.btnA) grid.addWidget(self.btnB) def clickA(self): self.hide() dlg = A() ret = dlg.exec_() print('ret',ret) self.show() def clickB(self): self.b = B() if __name__ == "__main__": app = QApplication([]) w = W() w.show() app.exec_()
Отредактировано vic57 (Сен. 14, 2017 11:51:35)
Офлайн
294
gmaksimВсеравно нихрена непонятно, что значит “идет возврат к главному экрану”, а где в это время главный экран? вы его закрываете или как? если не закрываете, то почему нельзя просто сдерать
В классе one размещена кнопка, которая (должна) возвращать нас обратно на стартовый экран (то что выводит класс main - две кнопки с выбором).
Т.е. запустился main, предлагает по нажатию кнопок свой функционал (на примере кода выше one и two), по завершению этого функционала идет возврат к “главному экрану” (метод main) где опять можем выбрать какое-то действие (классы one и two).
Надеюсь так понятнее.
root.show() root.activateWindow()
gmaksimО_о. Это ересь и жесть, в вашем конкретном случае. Налицо непонимание как работает Qt вообще и пайтон в частности.
но по завершению функционала класса, банальный вызов main не срабатывает, ничего не отображается.
def main(): app = QApplication(sys.argv) ........ sys.exit(app.exec_())
[code python][/code]
Отредактировано PEHDOM (Сен. 14, 2017 12:35:34)
Офлайн
0
Разобрался, всем спасибо!
Офлайн