get paid

Get paid for the tasks you do online

2019年1月29日 星期二

PyQT5 教學 --- 訊號與曹進階

上一篇有提到如果有多個按鈕, 他要觸發相識的東西有需要一個個寫對應的訊號 跟 槽嗎

上一篇我們設計了 81 個按鈕, 所以會產生81 個訊號, 如果對應的結果是完全相同當然只要寫一個槽就好了
但如果對應的結果只是相似, 但不完全要同要如何處理呢?

我們先來demo 要如何產生 81 個訊號, 這部分是我 try 很久的



#import 用到的 package

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QGridLayout, QPushButton,QMessageBox
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot

#定義 主windows
def window():
   app = QApplication(sys.argv)
   win = QWidget()
   grid = QGridLayout()
   dict =[]

   for i in range(0,9):
      for j in range(0,9):
         k = QPushButton(str(i+1)+"*"+str(j+1))
         grid.addWidget(k,i,j) #將button 加入 widget
         print(k)
         k.clicked.connect(showMessage)  #將 push button 訊號指向 show Message 槽

   win.setLayout(grid)  # 將 grid 加入 windows
   win.setWindowTitle("PyQt Grid Example")
   win.setGeometry(50,50,200,200)
   win.show()
   sys.exit(app.exec_())


#Show Message 的內容跟前幾篇提到的 QMessage 相同

def showMessage():
    print("clicked")
    msgBox = QMessageBox()
    msgBox.setIcon(QMessageBox.Information)
    msgBox.setText("Button is clicked")
    msgBox.setWindowTitle("QMessageBox Example")
    msgBox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
    # msgBox.buttonClicked.connect(msgButtonClick)
    msgBox.exec()
    msgBox.show()


if __name__ == '__main__':
   window()



上面的 Signal 與 Slot ,看起來很簡單吧, 但是為何我會 Try 很久呢?
主要是因為我把 clicked.connect  與 show Message 放在另一個程式, 這個時候我的
 k.clicked.connect 中的 K 需要把它指定為QPushbutton 才能, 而不能只是一個變數
另外外部呼叫的所以每一個 button 都要有一個變數, 不然他不知道要指向哪裡

之所以我會把Signal 與 Slot 是因為 UI 是用 QT Designer 產生的, 且 Signal 與 Slot 教父複雜
所以想分開寫

但如果可以想寫一起, 會簡潔很多

另一個原因是 Slot 其實有限制, 這邊呼叫的都是相同的內容
所以簡單很多,
如果是要用一個Slot function , 帶不同的參數,以對應不同的結果那就要小心了

因為 呼叫slot 時不能帶參數的, 這跟一般 function 呼叫不同

但解法很簡單 下一篇會解釋



https://www.amazon.com/gp/product/1449355730/ref=as_li_tl?ie=UTF8&tag=sammyoython-20&camp=1789&creative=9325&linkCode=as2&creativeASIN=1449355730&linkId=080ac10887e654d6eadc51f44a1c5774

沒有留言:

張貼留言

ChartGPT 學 python 很強喔

 ChartGPT 最近很紅 ,  前一陣子有一些小 module  本來想 google  一下 語法 但發現用 chartGPT 直接請他給 sample code 反而較快 所以只要你有基本 知識 ChartGPT 可以加速你的開發 好用喔