视窗中打开新视窗
这篇教学会介绍使用 PyQt6 建立基本的应用程序视窗,并在主视窗中点击按钮打开新视窗,更会进一步实作点击按钮修改其他视窗文字的效果。
快速导览:
因为 Google Colab 不支援 PyQt6,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda )。
建立 PyQt6 视窗
参考“QPushButton 按钮”文章范例,建立具有 QLabel 和 QPushButton 的视窗。
from PyQt6 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
label = QtWidgets.QLabel(Form)
label.setText('測試文字')
label.setStyleSheet('font-size:20px;')
label.setGeometry(50,30,100,30)
btn = QtWidgets.QPushButton(Form)
btn.setText('開啟新視窗')
btn.setStyleSheet('font-size:16px;')
btn.setGeometry(40,60,120,40)
Form.show()
sys.exit(app.exec())
使用 class 的写法:
from PyQt6 import QtWidgets
import sys
class mainWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 200)
self.ui()
def ui(self):
self.label = QtWidgets.QLabel(self)
self.label.setText('測試文字')
self.label.setStyleSheet('font-size:20px;')
self.label.setGeometry(50,30,100,30)
self.btn = QtWidgets.QPushButton(self)
self.btn.setText('開啟新視窗')
self.btn.setStyleSheet('font-size:16px;')
self.btn.setGeometry(40,60,120,40)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = mainWindow()
Form.show()
sys.exit(app.exec())
主视窗点击按钮,打开新视窗
主视窗建立后,仿照主视窗建立方法建立新视窗,并将主视窗的按钮绑定“点击后打开新视窗”的匿名函数,程序执行后,点击主视窗的按钮,就会打开新视窗。
from PyQt6 import QtWidgets, QtGui, QtCore
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
label = QtWidgets.QLabel(Form)
label.setText('測試文字')
label.setStyleSheet('font-size:20px;')
label.setGeometry(50,30,100,30)
btn = QtWidgets.QPushButton(Form)
btn.setText('開啟新視窗')
btn.setStyleSheet('font-size:16px;')
btn.setGeometry(40,60,120,40)
btn.clicked.connect(lambda:Form2.show()) # 使用 lambda 函式,顯示新視窗
Form2 = QtWidgets.QWidget() # 建立新視窗
Form2.setWindowTitle('oxxo.studio.2')
Form2.resize(300, 200)
btn2 = QtWidgets.QPushButton(Form2)
btn2.setText('test')
btn2.setGeometry(110,60,50,30)
Form.show()
sys.exit(app.exec())
由于多视窗可能会牵扯到互相呼叫与传递消息的操作,建议使用 class 的做法。
from PyQt6 import QtWidgets
import sys
# 主視窗
class mainWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 200)
self.ui()
def ui(self):
self.label = QtWidgets.QLabel(self)
self.label.setText('測試文字')
self.label.setStyleSheet('font-size:20px;')
self.label.setGeometry(50,30,100,30)
self.btn = QtWidgets.QPushButton(self)
self.btn.setText('開啟新視窗')
self.btn.setStyleSheet('font-size:16px;')
self.btn.setGeometry(40,60,120,40)
self.btn.clicked.connect(self.showNewWindow)
def showNewWindow(self):
self.nw = newWindow() # 連接新視窗
self.nw.show() # 顯示新視窗
x = self.nw.pos().x() # 取得新視窗目前 x 座標
y = self.nw.pos().y() # 取得新視窗目前 y 座標
self.nw.move(x+100, y+100) # 移動新視窗位置
# 新視窗
class newWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio.2')
self.resize(300, 200)
self.ui()
def ui(self):
self.btn = QtWidgets.QPushButton(self)
self.btn.setText('test')
self.btn.setStyleSheet('font-size:16px;')
self.btn.setGeometry(40,60,120,40)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = mainWindow()
Form.show()
sys.exit(app.exec())
点击按钮修改其他视窗文字
在主视窗点击按钮所打开的新视窗,是根据定义的 class 而产生的新视窗对象,因此只要将主视窗与新视窗的程序都写在主视窗里,就能让彼此都能获得点击按钮的消息,执行下方的程序码,点击按钮打开新视窗后,点击新视窗的按钮时,主视窗的文字会发生变化,点击主视窗的按钮时,新视窗里的文字也会发生变化。
from PyQt6 import QtWidgets
import sys
class mainWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 200)
self.ui()
def ui(self):
self.label = QtWidgets.QLabel(self)
self.label.setText('測試文字')
self.label.setStyleSheet('font-size:20px;')
self.label.setGeometry(50,30,100,30)
self.btn = QtWidgets.QPushButton(self)
self.btn.setText('開啟新視窗')
self.btn.setStyleSheet('font-size:16px;')
self.btn.setGeometry(40,60,120,40)
self.btn.clicked.connect(self.showNewWindow) # 點擊按鈕,開啟新視窗
self.btn2 = QtWidgets.QPushButton(self)
self.btn2.setText('在新視窗裡顯示文字')
self.btn2.setStyleSheet('font-size:16px;')
self.btn2.setGeometry(40,100,200,40)
self.btn2.clicked.connect(self.changeNewWindowText) # 點擊按鈕,改變新視窗裡的文字
def showNewWindow(self):
self.nw = newWindow()
self.nw.show()
x = self.nw.pos().x()
y = self.nw.pos().y()
self.nw.move(x+50, y+50)
self.nw.btn.clicked.connect(self.changeText) # 點擊按鈕,改變主視窗裡的文字
def changeText(self):
self.label.setText('點擊按鈕囉')
def changeNewWindowText(self):
self.nw.label.setText('主視窗也點擊按鈕囉')
class newWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio.2')
self.resize(300, 200)
self.ui()
def ui(self):
self.label = QtWidgets.QLabel(self)
self.label.setText('')
self.label.setStyleSheet('font-size:20px;')
self.label.setGeometry(50,30,200,30)
self.btn = QtWidgets.QPushButton(self)
self.btn.setText('test')
self.btn.setStyleSheet('font-size:16px;')
self.btn.setGeometry(40,60,120,40)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = mainWindow()
Form.show()
sys.exit(app.exec())
微信扫码关注
抖音扫码关注