PyQt5教程——第一個程式(2)
用PyQt5寫的第一個程式
在這篇PyQt5教程中,我們可以學習一些PyQt5的基礎應用。
簡單的例子
這是一個顯示一個小視窗的簡單例子。我們可以做許多這樣的視窗。我們可以調整它的視窗尺寸,最大化或最小化這個視窗。這些需求需要碼很多程式碼。但一些人已經寫好了這些功能實現。因為這些需求在很多應用中重複出現了,在這裡我們不需要重新寫這些程式碼。PyQt5是一個高階工具套件,為我們封裝了很多複雜功能的實現程式碼,我們可以更加簡單的通過函式去實現這些功能。如果我們是在一個低階工具套件中寫程式碼的話,下面例子的程式碼很有可能需要數百行來實現。
1 #!/usr/bin/python3 2# -*- coding: utf-8 -*- 3 4 """ 5 ZetCode PyQt5 教程 6 在這個例子中, 我們用PyQt5建立了一個簡單的視窗。 7 8 作者: Jan Bodnar 9 網站: zetcode.com 10 最後一次編輯: January 2015 11 """ 12 13 import sys 14 from PyQt5.QtWidgets import QApplication, QWidget 15 16 17 if __name__ == '__main__': 18 19 app = QApplication(sys.argv)20 21 w = QWidget() 22 w.resize(250, 150) 23 w.move(300, 300) 24 w.setWindowTitle('Simple') 25 w.show() 26 27 sys.exit(app.exec_())
上面的程式碼示例會在螢幕上顯示一個小視窗。
import sys from PyQt5.QtWidgets import QApplication, QWidget
這裡我們進行了一些必要模組的匯入。最基礎的widget元件位於PyQt5.QtWidget模組中
app = QApplication(sys.argv)
所有的PyQt5應用必須建立一個應用(Application)物件。sys.argv引數是一個來自命令列的引數列表。Python指令碼可以在shell中執行。這是我們用來控制我們應用啟動的一種方法。
w = QWidget()
Qwidget元件是PyQt5中所有使用者介面類的基礎類。我們給QWidget提供了預設的構造方法。預設構造方法沒有父類。沒有父類的widget元件將被作為視窗使用。
w.resize(250, 150)
resize()方法調整了widget元件的大小。它現在是250px寬,150px高。
w.move(300, 300)
move()方法移動widget元件到一個位置,這個位置是螢幕上x=300,y=300的座標。
w.setWindowTitle('Simple')
這裡我們設定了我們視窗的標題。這個標題顯示在標題欄中。
w.show()
show()方法在螢幕上顯示出widget。一個widget物件在這裡第一次被在記憶體中建立,並且之後在螢幕上顯示。
sys.exit(app.exec_())
最後,應用進入主迴圈。在這個地方,事件處理開始執行。主迴圈用於接收來自視窗觸發的事件,並且轉發他們到widget應用上處理。如果我們呼叫exit()方法或主widget元件被銷燬,主迴圈將退出。sys.exit()方法確保一個不留垃圾的退出。系統環境將會被通知應用是怎樣被結束的。
exec_()方法有一個下劃線。因為exec是Python保留關鍵字。因此,用exec_()來代替。
Figure: Simple
一個簡單的應用圖示
應用圖示是一個常常顯示在標題欄左上方角落的小圖片。在下面的例子裡,我們將展示我們如何在PyQt5中顯示應用圖示。我們也將介紹一些新方法的使用。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This example shows an icon in the titlebar of the window. author: Jan Bodnar website: zetcode.com last edited: January 2015 """ import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui import QIcon class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 300, 220) self.setWindowTitle('Icon') self.setWindowIcon(QIcon('web.png')) self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
上述的例子使用傳統的面向過程的程式碼風格。Python程式語言提供面向過程和麵向物件的程式碼風格。PyQt5程式設計意味著就是面向物件的程式設計。
class Example(QWidget): def __init__(self): super().__init__() ...
在面向物件程式設計中有三個重要的東西,分別是類,資料和方法。這裡我們建立了一個新類叫做Example。Example類繼承自QWidget類。這意味著我們呼叫了兩個構造方法:第一個是Example類的構造方法,第二個是被繼承類的構造方法。super()方法返回了Example類的父類物件,並且我們呼叫了父類的構造方法。__init__()方法是Python語言中的構造方法。
self.initUI()
GUI的建立授予initUI()方法完成。
self.setGeometry(300, 300, 300, 220) self.setWindowTitle('Icon') self.setWindowIcon(QIcon('web.png'))
三個方法都繼承自QWidgets類。setGeometry()做了兩件事:將視窗在螢幕上顯示,並設定了它的尺寸。setGeometry()方法的前兩個引數定位了視窗的x軸和y軸位置。第三個引數是定義視窗的寬度,第四個引數是定義視窗的高度。事實上,這是將resize()和move()方法融合在一個方法內。為了做好這個例子,我們建立了一個QIcon物件。QIcon物件接收一個我們要顯示的圖片路徑作為引數。
if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
應用和example物件被建立。主迴圈被啟動。
Figure: Icon
顯示一個提示文字
我們可以給我們的任何widget元件提供氣泡幫助提示框。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This example shows a tooltip on a window and a button. author: Jan Bodnar website: zetcode.com last edited: January 2015 """ import sys from PyQt5.QtWidgets import (QWidget, QToolTip, QPushButton, QApplication) from PyQt5.QtGui import QFont class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): QToolTip.setFont(QFont('SansSerif', 10)) self.setToolTip('This is a <b>QWidget</b> widget') btn = QPushButton('Button', self) btn.setToolTip('This is a <b>QPushButton</b> widget') btn.resize(btn.sizeHint()) btn.move(50, 50) self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Tooltips') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
在這個例子中,我們為兩個PyQt5元件顯示了提示框。
QToolTip.setFont(QFont('SansSerif', 10))
這個靜態方法設定了用於提示框的字型。我們使用10px大小的SansSerif字型。
self.setToolTip('This is a <b>QWidget</b> widget')
為了建立提示框,我們呼叫了setTooltip()方法。我們可以在提示框中使用富文字格式。
btn = QPushButton('Button', self) btn.setToolTip('This is a <b>QPushButton</b> widget')
我們建立了一個按鈕元件並且為它設定一個提示框。
btn.resize(btn.sizeHint()) btn.move(50, 50)
這裡改變了按鈕的大小,並移動了在視窗上的位置。setHint()方法給了按鈕一個推薦的大小。
Figure: Tooltips
關閉視窗
明顯的關閉視窗的方法是點選標題欄的X標記。在下面的例子中,我們將展示怎麼通過程式來關閉我們的視窗。我們將簡單的觸及訊號和槽機制。
QPushButton(string text, QWidget parent = None)
text引數是將顯示在按鈕中的內容。parent引數是一個用來放置我們按鈕的元件。在我們的例子中將會是QWidget元件。一個應用的元件是分層結構的。在這個分層內,大多陣列件都有父類。沒有父類的元件是頂級視窗。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This program creates a quit button. When we press the button, the application terminates. author: Jan Bodnar website: zetcode.com last edited: January 2015 """ import sys from PyQt5.QtWidgets import QWidget, QPushButton, QApplication from PyQt5.QtCore import QCoreApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): qbtn = QPushButton('Quit', self) qbtn.clicked.connect(QCoreApplication.instance().quit) qbtn.resize(qbtn.sizeHint()) qbtn.move(50, 50) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Quit button') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
在這個例子中,我們建立一個退出按鈕,一旦按下按鈕,應用將會結束。
from PyQt5.QtCore import QCoreApplication
我們需要一個來自QtCore的物件模組。
qbtn = QPushButton('Quit', self)
我們建立了一個按鈕。按鈕是一個QPushButton類的例項。構造方法的第一個引數是顯示在button上的標籤文字。第二個引數是父元件。父元件是Example元件,它繼承了QWiget類。
qbtn.clicked.connect(QCoreApplication.instance().quit)
在PyQt5中,事件處理系統由訊號&槽機制建立。如果我們點選了按鈕,訊號clicked被髮送。槽可以是Qt內建的槽或Python 的一個方法呼叫。QCoreApplication類包含了主事件迴圈;它處理和轉發所有事件。instance()方法給我們返回一個例項化物件。注意QCoreAppli類由QApplication建立。點選訊號連線到quit()方法,將結束應用。事件通訊在兩個物件之間進行:傳送者和接受者。傳送者是按鈕,接受者是應用物件。
Figure: Quit button
Message Box
預設的,如果我們點選了標題欄上的x按鈕,QWidget會被關閉。又是我們希望修改這個預設動作。舉個例子,如果我們有個檔案在編輯器內開啟,並且我們對這個檔案做了一些修改。 我們顯示一個message box來確認這個動作。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This program shows a confirmation message box when we click on the close button of the application window. author: Jan Bodnar website: zetcode.com last edited: January 2015 """ import sys from PyQt5.QtWidgets import QWidget, QMessageBox, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Message box') self.show() def closeEvent(self, event): reply = QMessageBox.question(self, 'Message', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
如果我們關閉一個QWidget,QCloseEvent類事件將被生成。要修改元件動作我們需要重新實現closeEvent()事件處理方法。
reply = QMessageBox.question(self, 'Message', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
我們現實一個帶兩個按鈕的message box:YES和No按鈕。程式碼中第一個字串的內容被顯示在標題欄上。第二個字串是對話方塊上顯示的文字。第三個引數指定了顯示在對話方塊上的按鈕集合。最後一個引數是預設選中的按鈕。這個按鈕一開始就獲得焦點。返回值被儲存在reply變數中。
if reply == QtGui.QMessageBox.Yes: event.accept() else: event.ignore()
在這裡我們測試一下返回值。程式碼邏輯是如果我們點選Yes按鈕,我們接收到的事件關閉事件,這將導致了元件的關閉和應用的結束。否則不是點選Yes按鈕的話我們將忽略將關閉事件。
Figure: Message box
螢幕上的居中視窗
下面的指令碼展示我們如何把視窗居中顯示到桌面視窗。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This program centers a window on the screen. author: Jan Bodnar website: zetcode.com last edited: January 2015 """ import sys from PyQt5.QtWidgets import QWidget, QDesktopWidget, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.resize(250, 150) self.center() self.setWindowTitle('Center') self.show() def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
QtGui.QDesktopWidget類提供了我們桌面視窗的資訊,包含了螢幕尺寸。
self.center()
將視窗居中放置的程式碼在自定義的center()方法中。
qr = self.frameGeometry()
我們獲得主視窗的一個矩形特定幾何圖形。這包含了視窗的框架。
cp = QDesktopWidget().availableGeometry().center()
我們算出相對於顯示器的絕對值。並且從這個絕對值中,我們獲得了螢幕中心點。
qr.moveCenter(cp)
我們的矩形已經設定好了它的寬和高。現在我們把矩形的中心設定到螢幕的中間去。矩形的大小並不會改變。
self.move(qr.topLeft())我們移動了應用視窗的左上方的點到qr矩形的左上方的點,因此居中顯示在我們的螢幕上。 這是PyQt5教程的一部分,這部分涵蓋了一些基礎知識。
相關推薦
PyQt5教程——第一個程式(2)
用PyQt5寫的第一個程式 在這篇PyQt5教程中,我們可以學習一些PyQt5的基礎應用。 簡單的例子 這是一個顯示一個小視窗的簡單例子。我們可以做許多這樣的視窗。我們可以調整它的視窗尺寸,最大化或最小化這個視窗。這些需求需要碼很多程式碼。但一些人已經寫好了這些功能實現。因為這些需求在很多應用中重複
第四章 第一個程式(總結)
示例:8086程式框架 assume cs: code code segment mov ax, 3 mov bx, 4 add a
影象識別opencv-第一個程式(1)
==============開新坑====撒花撒花=========== 聽說opencv結合AR可以玩的很6,於是新坑就開了。 沒有什麼理由,只是熱愛技術。 ================吐槽完畢======== 關於搭建環境什麼的就不說了 ,直接上程式,順便提醒下,
【記錄】STM32學習之第一個程式(點亮LED)
STM32學習之第一個程式(點亮LED) 開發板:Nucelo L053R8 芯 片:STM32L053R8 軟 件:IAR for ARM 7.4, STM32CubeL0 程式碼示例
Python3的第一個程序(三)
cal mod 此外 work 命令行 數學 提示 simpson 如果 現在,了解了如何啟動和退出Python的交互式環境,我們就可以正式開始編寫Python代碼了。 在寫代碼之前,請千萬不要用“復制”-“粘貼”把代碼從頁面粘貼到你自己的電腦上。寫程序也講究一個感覺,你需
pyqt(二) 創建第一個程序(helloworld)
存在 == () 目錄 控制 family 發的 sta port 1.運行Qt Creator QtCreator主界面分為了6個模式:歡迎模式、編輯模式、設計模式、Debug調試模式、項目模式和幫助模式,分別由左側的6個圖標進行切換,對應的快捷鍵是Ctrl +
Keras搭建第一個分類(Classification)神經網路(mnist手寫體數字分類)
我們使用mnist資料集,這個資料集有手寫體數字0-9的圖片,一共10類,我們對這個資料集中的手寫體數字圖片進行分類。 如果mnist資料集無法自動下載,可能是因為from keras.datasets import mnist自動下載資料集的網址被牆,請手動下載並按下面程式碼中註釋進行相應
使用Visual Studio 2017開發Python程式(2)
建立第一個Hello Word程式 (1)開啟Microsoft Visual Studio 2017,依次單擊頂部工具欄中的“檔案”>“新建” >“專案”命令,彈出“新建專案”對話方塊。在左側模板列表中選擇“Python”選項,在右側選擇“Python應用程式”選項。在下方文字
leetcode:確實的第一個整數(java)
package LeetCode; import java.util.Arrays; public class FirstMissingPositive { public int firstMissingPositive(int[] nums) { /* if (nums.
unix/linux程式設計實踐教程C語言補充(2)
1 getchar()和putchar()函式 getchar()函式的功能是從終端接受一個字元。可以將其置於程式中實現暫停功能。 getchar()函式接受的字元可以賦給一個字元型或整型變數,也可以賦給任何變數,直接輸出。 putchar(引數) 引數可以是一個字元
微信小程式(2)引入模組
微信小程式中有些公共的js程式碼不需要在每個頁面中重複編寫,所以可以採用將其模組化的方式進行引用。 1.需要被引用的公共模組 新建pages/utils/common.js &
微信小程式(2)-小程式資訊完善以及開發前準備,程式碼稽核與釋出
1.完成註冊後,在微信公眾平臺官網首頁(mp.weixin.qq.com)的登入藉口直接登入 2.完善小程式資訊(完成註冊後,微信小程式資訊完善步驟和開發可同步進行) *選擇對公打款的使用者,完成匯款後,可以補充小程式名稱資訊,上傳小程式影象,填寫小程式介紹並且確定小程式服
微信小程式(2)控制元件
一。基本控制元件----button按鈕 <!--index.wxml--> <view class="container"> <button size="mini">按鈕</button> <button
《崔慶才Python3網路爬蟲開發實戰教程》學習筆記(2):常用庫函式的安裝與配置
python的一大優勢就是庫函式極其豐富,網路爬蟲工具的開發使用也是藉助於這一優勢來完成的。那麼要想用Python3做網路爬蟲的開發需要那些庫函式的支援呢? 與網路爬蟲開發相關的庫大約有6種,分別為: 請求庫:requests,selenium,ChromeDrive
Java新手專案之第一個專案(一)2016.5.16-5.22
Java學生選課教務系統 作為學習Java的新手,之前學過點Java的基礎,後來又看了看網易雲課堂的java,總共差不多兩個月的時間吧,陸陸續續跟著書和視訊編了一些程式。馬上也要畢業,現在開始,希望能夠寫一些新手,進階,高階專案經歷。一方面,是對自己實踐的一個
Netty聊天程式(2):從0開始實戰100w級流量應用 - 圖解Netty系列
客戶端 Client 登入和響應處理 瘋狂創客圈 Java 分散式聊天室【 億級流量】實戰系列之 17【 部落格園 總入口 】 文章目錄 客戶端 Client 登入和響應處理 寫在前面 客戶端的會話管理 客戶端的邏輯構成
python-進階教程-多個字典(對映)的合併
0.摘要 當我們處理多個字典(或稱為對映,因為字典是Python中唯一的對映結構),可以通過將多個字典合併為一個字典的方式實現批量處理。 1.ChainMap類 a = {'x': 1, 'z': 3 } b = {'y':
使用Mocha+spectron測試Electron打包的桌面版程式(2)PO模型
在上一篇文章中,我們運行了一個小的demo,這一篇,我們講一下如何將測試用例做成PO模型,並輸出一份簡單的測試報告。 首先是工程目錄結構,如下圖所示(使用VSCode開啟): 其中node_modules中包含執行指令碼安裝的庫等;pageobjects中
第十一週閱讀程式(2)
程式碼: #include<iostream> using namespace std; class G { public: static int m; G( ) //建構函式 { m++; cout&l
Java學習小程式(2)輸出三個數中的最大值
使用者從控制檯接收三個整數,通過程式找出三個數中的最大值。(3種方法) package day03; //輸入三個int數中的最大值 import java.util.Scanner; public class Text01 { public static void