2019年12月10日 星期二

#桌面上的計算機(一)--基礎認識

--使用PyQt套件

#原文出處

#摘要紀錄與說明
--python的GUI套件,有 Tkinter, wxPython, PyQt, PySide2...等等
--PyQt5 是基於Qt5而來

--請直接下載檔案執行如果是複製網頁上的程式,貼上後請注意縮排問題。
--程式碼的說明,就在程式裡。

#測試小部件
  • 建立虛擬環境    python -m venv myenv
  • 安裝    pip install pyqt5
#第一個視窗hello world(ex1.py)
      1. import sys #只是為了使用在釋放程式的記憶體


      2. from PyQt5.QtWidgets import QApplication #qt的應用程式
      3. from PyQt5.QtWidgets import QLabel #qt的Label
      4. from PyQt5.QtWidgets import QWidget #qt的總部件,就是這個程式的視窗

      5. app QApplication(sys.argv#建立主程式的實體 app ,參數是一個list,如果不需要sys.argv,可以改成[]

      6. #以下一一建立程式中的顯示部件
      7. window QWidget() #建立視窗實體
      8. window.setWindowTitle('PyQt5 App'#視窗的抬頭
      9. window.setGeometry(20020028080#視窗的位置和大小(x,y,,)
      10. #window.move(6015#重新將視窗移到電腦螢幕的(60,15)位置
      11. helloMsg QLabel('<h1>Hello World!</h1>'parent=window#建立標籤實體,qt5接受html標籤
      12. helloMsg.move(6015#標籤移到視窗中的某位置

      13. window.show() #將視窗設定為顯示


      14. sys.exit(app.exec()) #開始執行應用程式,並在結束後,釋放記憶體。如果是python2,要用app.exec_()
p.s.載入要花一點時間,結果視窗關閉後,才能再回到命令列視窗。

#建立基本概念
  1. Widgets:各種部件
  2. Layout managers:排列部件的方式
  3. Dialogs:對話視窗
  4. Main windows:主視窗
  5. Applications:程式
  6. Event loops:監聽事件
  7. Signals and slots:事件發出的訊號(signals)和對應的處理程式(slots)。
1. 各種部件
  • Buttons:按鈕
  • Labels:多行文字
  • Line edits:單行文字
  • Combo boxes:下拉列表
  • Radio buttons:單選按鈕
......

2. 排列部件方式
  1. QHBoxLayout:水平排列容器 ex2.py
  2. QVBoxLayout:垂直排列容器 ex3.py
  3. QGridLayout:格狀排列容器 ex4.py

  4. QFormLayout:表單形式容器 ex5.py
3. 對話視窗(和主視窗彼此獨立,可以想成就是一般軟體裡跳出來,讓我們設定內容的視窗)--初學應該先學主視窗
特性:
對話視窗有2個內定的按鈕,「ok」、「cancel」。
有model 和 modeless 二種,model要用建class。
model 要用.exec()呼叫,modeless則是用.show()

這裡的範例是使用model的對話視窗 ex6.py
4. 主視窗  ex7.py
特性:
內定有功能列、工具列、狀態列等等的排列部件
一定要有中央部件,才有內容嘛
可以開出對話視窗來完成特定功能
5. 程式
在這裡,運用的是MVC架構,程式就是Control。它從view監聽接收資料,轉到model去,model做好資料的運算,再藉由Control,送到view顯示。

6. 監聽事件
一個無限的迴圈,時時看看有沒有哪個部件發出訊號了。就是.exec()的運作。
註:python2 使用.exec_(),python3 使用.exec()和.exec_()都可以。(因為python2自己內部有.exec())

7. 事件發出的訊號和對應的處理程式  ex8.py
訊號,如滑鼠按鍵或鍵盤被按下等等,代表某一個部件狀態改變了,需要處理程式來做出必要的處置。
它們之間的機制有
一個訊號,發給一個或多個處理程式。
一個訊號,連結到另外一個訊號。
一個處理程式,處理多個訊號。

python程式寫法,widget.signal.connect(slot_function)
ex7.py 中的程式,btn.clicked.connect(greeting) 當按鈕按下去(click),就執行greeting程式。
程式需要傳遞參數時,
在程式定義的部份,如同一般函數,將參數寫在(  )內,使用在字串之內時,用{  }。
在程式呼叫的部份,要使用functools.partial來間接呼叫。btn.clicked.connect(functools.partial(greeting,"world"))
p.s.使用functools,要先import functools。
請見 ex9.py

沒有留言:

張貼留言