怎么通过点击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_())
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_())
代码量不大的话,放一个文件就行了,要是代码比较多的话,考虑到维护的方便,还是放在2个里面比较好,这种事件的触发和界面切换一般都是用signal-slot做的,使得语义看起来非常清晰
# -*- 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_())