get paid

Get paid for the tasks you do online

2019年1月29日 星期二

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

上一篇有提到訊號呼叫槽 函數時不能帶參數, 但以我們 9 9 乘法表的例子
我們一定要帶參數啊, 不然就要寫很多訊號跟槽了
之前不知不能帶參數 花了很多時間 try and error.
這也是為何我要寫這個 Blog 的原因之一

解法其實很簡單,  網路上有人提到用lambda , 但我比較喜歡用partial.

partial 是 functools 下的一個函數

只要將要呼叫的function ,與 參數 改用 partical 包起來就可以了

k.clicked.connect(partial(showMessage,i,j))

完整程式如下
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QGridLayout, QPushButton,QMessageBox
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot
from functools import partial #import partial

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)
         print(k)
         k.clicked.connect(partial(showMessage,i,j)) #呼叫showMessage 並帶入i, j


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

def showMessage(i,j):
    x=(i+1)*(j+1)
    msgBox = QMessageBox()

    msgBox.setText("{} * {}= {}".format(str(i+1),str(j+1),str(x)))
    msgBox.setWindowTitle("Signal & Slot ")
    msgBox.setStandardButtons(QMessageBox.Ok)
    # msgBox.buttonClicked.connect(msgButtonClick)
    msgBox.exec()
    msgBox.show()


if __name__ == '__main__':
   window()

結果如下



沒有留言:

張貼留言

ChartGPT 學 python 很強喔

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