1. 程式人生 > >PyQt5教程——第一個程式(2)

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_()來代替。

SimpleFigure: 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物件被建立。主迴圈被啟動。

IconFigure: 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()方法給了按鈕一個推薦的大小。

TooltipsFigure: 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()方法,將結束應用。事件通訊在兩個物件之間進行:傳送者和接受者。傳送者是按鈕,接受者是應用物件。

Quit buttonFigure: 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按鈕的話我們將忽略將關閉事件。

Message boxFigure: 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打包的桌面版程式2PO模型

在上一篇文章中,我們運行了一個小的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