# PyQt5範例程式 ## PyQt5 - 多視窗傳值 ```python= from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QGridLayout, QHBoxLayout from PyQt5.QtCore import pyqtSignal import sys from PyQt5.QtWidgets import QLabel, QPushButton,QLineEdit class Main_GUI(QMainWindow): # 建立兩個信號槽,用來觸發顯示視窗的函式 open_child1 = pyqtSignal() open_child2 = pyqtSignal() def __init__(self): super().__init__() self.initUI() def initUI(self): # 視窗名稱 self.setWindowTitle(f'Main_GUI') # 設定布局 widget = QWidget() self.setCentralWidget(widget) layout = QHBoxLayout() widget.setLayout(layout) # 按鈕1 btn = QPushButton('Open1') btn.clicked.connect(self.open1) layout.addWidget(btn) # 按鈕2 btn = QPushButton('Open2') btn.clicked.connect(self.open2) layout.addWidget(btn) # 初始化完成後顯示自己 self.show() def open1(self): self.open_child1.emit() def open2(self): self.open_child2.emit() class child1(QWidget): # 傳送文字的信號槽 # ()內的是要發送的資料型態 # str表示發送信號時會帶一串文字 # 亦可使用dict/list之類格式夾帶更多資料 send_message = pyqtSignal(str) def __init__(self): super().__init__() self.initUI() def initUI(self): # 設定視窗名稱及大小 self.setFixedSize(250, 150) self.setWindowTitle(f'Child1') # 設定布局 # 注意布局縱軸是第1個參數 # 橫軸是第二個參數 layout = QGridLayout() self.setLayout(layout) # 在(0,0)的位置加入一個占用1*1大小的標籤 layout.addWidget(QLabel('輸入文字:'), 0, 0, 1, 1) # 在(0,1)的位置加入一個占用1*2大小的輸入框 self.inp = QLineEdit() layout.addWidget(self.inp, 0, 1, 1, 2) # 在(1,0)的位置加入一個占用1*3大小的按鈕 # 此按鈕綁定send函數 btn = QPushButton('確定') btn.clicked.connect(self.send) layout.addWidget(btn, 1, 0, 1, 3) def open(self): self.show() def send(self): # 帶著輸入的文字發送一個信號 self.send_message.emit(self.inp.text()) class child2(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # 設定視窗名稱及大小 self.setFixedSize(250, 150) self.setWindowTitle(f'Child2') # 設定布局 layout = QHBoxLayout() self.setLayout(layout) # 設定用來顯示的標籤 layout.addWidget(QLabel('接收文字:')) # 設定用來顯示輸入文字的標籤 self.print_label = QLabel('') layout.addWidget(self.print_label) def open(self): self.show() def print_message(self,str): self.print_label.setText(str) if __name__ == '__main__': app = QApplication(sys.argv) # 先建立三個視窗物件 mainGUI = Main_GUI() child1 = child1() child2 = child2() # 將主畫面兩個信號發送時綁定兩個子視窗的處理函式 mainGUI.open_child1.connect(child1.open) mainGUI.open_child2.connect(child2.open) # 將child1發送文字的信號綁定child2的處理函式 child1.send_message.connect(child2.print_message) sys.exit(app.exec_()) ``` ## PyQt5 - 更改背景色 ```python= from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QHBoxLayout from PyQt5.QtWidgets import QWidget, QLabel, QPushButton import sys class myGUI(QMainWindow): def __init__(self): super().__init__() self.lightList = [] vbox = QVBoxLayout() vbox.addLayout(self.makeButtonGroup(1)) vbox.addLayout(self.makeButtonGroup(2)) vbox.addLayout(self.makeButtonGroup(3)) widget = QWidget() self.setCentralWidget(widget) widget.setLayout(vbox) self.show() def makeButtonGroup(self,groupNumber): btn_start = QPushButton() btn_start.setText("Start Record "+str(groupNumber)) btn_start.clicked.connect(self.startRecord) btn_stop = QPushButton() btn_stop.setText("Stop Record "+str(groupNumber)) btn_stop.clicked.connect(self.stopRecord) lbl_light = QLabel("未錄影") lbl_light.setStyleSheet("QLabel { background-color : red}") self.lightList.append(lbl_light) hbox = QHBoxLayout() hbox.addWidget(btn_start) hbox.addWidget(btn_stop) hbox.addWidget(lbl_light) return hbox def startRecord(self): sender = self.sender() groupNumber = int(sender.text().split(" ")[-1]) self.lightList[groupNumber-1].setStyleSheet("QLabel { background-color : Green}") self.lightList[groupNumber - 1].setText("錄影中") def stopRecord(self): sender = self.sender() groupNumber = int(sender.text().split(" ")[-1]) self.lightList[groupNumber - 1].setStyleSheet("QLabel { background-color : red}") self.lightList[groupNumber - 1].setText("未錄影") if __name__ == '__main__': app = QApplication(sys.argv) mainGUI = myGUI() sys.exit(app.exec_()) ```