python - PyQt5点击button如何弹出新窗口?
黄舟
黄舟 2017-04-17 17:53:12
0
2
1893

怎么通过点击button,来打开一个新的窗口?
是写在同一个脚本里,还是把新窗口的代码放在另一个脚本里,然后通过点击按钮来运行?

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *

class FirstWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.windowUI()

    def windowUI(self):
        self.setWindowTitle("Login")
        self.textfield()
        self.center()

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def textfield(self):
        QToolTip.setFont(QFont('SansSerif', 12))
        user = QLabel("User:")
        userEdit = QLineEdit()
        userEdit.setToolTip("请输入你的帐号")

        passWord = QLabel("PassWord:")
        passWordEdit = QLineEdit()
        passWordEdit.setToolTip("请输入你的密码")

        grid = QGridLayout()
        grid.setSpacing(0)

        grid.addWidget(user, 0, 0)
        grid.addWidget(userEdit, 1, 0)
        grid.addWidget(passWord, 2, 0)
        grid.addWidget(passWordEdit, 3, 0)
        empty = QLabel()
        grid.addWidget(empty, 4, 0)

        btn_logon = QPushButton("Log on")
        btn_quit = QPushButton("Quit")
        grid.addWidget(btn_logon, 5, 0, 1, 2)
        grid.addWidget(btn_quit, 6, 0, 1, 2)

        btn_logon.clicked.connect(self.onclick)
        btn_quit.clicked.connect(quit)

        self.setLayout(grid)

    def onclick(self):
        newWindow = SecondWindow()
        newWindow.show()
        newWindow.exec_()

class SecondWindow(QWidget):
    def __init__(self):
        super().__init__
        self.newWindowUI

    def newWindowUI(self):
        self.resize(300,300)
        self.move(200,200)

if __name__ == "__main__":
    App = QApplication(sys.argv)
    ex = FirstWindow()
    ex.show()
    sys.exit(App.exec_())
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

reply all(2)
左手右手慢动作

If the amount of code is not large, just put it in one file. If there is a lot of code, considering the convenience of maintenance, it is better to put it in two files. The triggering of this kind of event and interface switching are generally done with signal-slot. , making the semantics look very clear

# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *


class FirstWindow(QWidget):

    close_signal = pyqtSignal()
    def __init__(self, parent=None):
        # super这个用法是调用父类的构造函数
        # parent=None表示默认没有父Widget,如果指定父亲Widget,则调用之
        super(FirstWindow, self).__init__(parent)
        self.resize(100, 100)
        self.btn = QToolButton(self)
        self.btn.setText("click")

    def closeEvent(self, event):
        self.close_signal.emit()
        self.close()


class SecondWindow(QWidget):
    def __init__(self, parent=None):
        super(SecondWindow, self).__init__(parent)
        self.resize(200, 200)
        self.setStyleSheet("background: black")

    def handle_click(self):
        if not self.isVisible():
            self.show()

    def handle_close(self):
        self.close()


if __name__ == "__main__":
    App = QApplication(sys.argv)
    ex = FirstWindow()
    s = SecondWindow()
    ex.btn.clicked.connect(s.handle_click)
    ex.btn.clicked.connect(ex.hide)
    ex.close_signal.connect(ex.close)
    ex.show()
    sys.exit(App.exec_())
巴扎黑

-- coding: utf-8 --

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class FirstWindow(QWidget):

close_signal = pyqtSignal()
def __init__(self, parent=None):
    # super这个用法是调用父类的构造函数,parent=None表示默认没有父Widget,如果有则调用之
    super(FirstWindow, self).__init__(parent)
    self.resize(800, 600)
    self.setMaximumSize(QSize(800, 600))
    self.btn = QToolButton(self)
    self.btn.setText("click")
    self.two = SecondWindow()
    self.btn.clicked.connect(self.two.handle_click)
    #self.btn.clicked.connect(self.hide)
    self.close_signal.connect(self.closeSlot)
    print("FirstWindow")

def closeEvent(self, event):
    print("close signal emit by FirstWindow")
    self.close_signal.emit()
    #self.close()

def closeSlot(self):
    print("close signal slot to SecondWindow")
    self.two.close()

class SecondWindow(QWidget):

close_signal = pyqtSignal()
def __init__(self, parent=None):
    super(SecondWindow, self).__init__(parent)
    self.resize(800, 600)
    self.setMaximumSize(QSize(800, 600))
    self.setStyleSheet("background: black")
    self.close_signal.connect(self.closeSlot)
    
def handle_click(self):
    if not self.isVisible():
        self.show()
        print("SecondWindow")

def closeEvent(self, event):
    print("close signal emit by SecondWindow")
    self.close_signal.emit()
    #self.close()

def closeSlot(self):
    print("close signal slot to FirstWindow")
    one.close()

if name == "__main__":

App = QApplication(sys.argv)
one = FirstWindow()
one.show()
sys.exit(App.exec_())
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template