1. 程式人生 > >PyQt5中文基礎教程2 Hello World

PyQt5中文基礎教程2 Hello World

Hello World

本章學習Qt的基本功能

這個簡單的小例子展示的是一個小視窗。但是我們可以在這個小視窗上面做很多事情,改變大小,最大化,最小化等,這需要很多程式碼才能實現。這在很多應用中很常見,沒必要每次都要重寫這部分程式碼,Qt已經提供了這些功能。PyQt5是一個高階的工具集合,相比使用低階的工具,PyQt能省略上百行程式碼。

例1,簡單的視窗

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

In this example, we create a simple
window in PyQt5.

author: Jan Bodnar
website: zetcode.com 
last edited: January 2015
"""
import sys from PyQt5.QtWidgets import QApplication, QWidget if __name__ == '__main__': app = QApplication(sys.argv) w = QWidget() w.resize(250, 150) w.move(300, 300) w.setWindowTitle('Simple') w.show() sys.exit(app.exec_())

執行上面的程式碼,能展示出一個小視窗。下面是每行程式碼的講解。

import sys
from PyQt5.QtWidgets import QApplication, QWidget

這裡引入了PyQt5.QtWidgets模組,這個模組包含了基本的元件。

app = QApplication(sys.argv)

每個PyQt5應用都必須建立一個應用物件。sys.argv是一組命令列引數的列表。Python可以在shell裡執行,這個引數提供對指令碼控制的功能。

w = QWidget()

QWidget空間是一個使用者介面的基本空間,它提供了基本的應用構造器。預設情況下,構造器是沒有父級的,沒有父級的構造器被稱為視窗(window)。

w.resize(250, 150)

resize()方法能改變控制元件的大小,這裡的意思是視窗寬250px,高150px。

w.move(300, 300)

move()是修改控制元件位置的的方法。它把控制元件放置到螢幕座標的(300, 300)的位置。注:螢幕座標系的原點是螢幕的左上角。

w.setWindowTitle('Simple')

我們給這個視窗添加了一個標題,標題在標題欄展示(雖然這看起來是一句廢話,但是後面還有很多欄,還是要注意一下,多了就蒙了)。

w.show()

show()能讓控制元件在桌面上顯示出來。控制元件在記憶體裡建立,之後才能在顯示器上顯示出來。

sys.exit(app.exec_())

最後,我們進入了應用的主迴圈中,事件處理器這個時候開始工作。主迴圈從視窗上接收事件,並把事件傳入到派發到應用控制元件裡。當呼叫exit()方法或直接銷燬主控制元件時,主迴圈就會結束。sys.exit()方法能確保主迴圈安全退出。外部環境能通知主控制元件怎麼結束。

exec_()之所以有個下劃線,是因為exec是一個Python的關鍵字。

程式預覽:

simple

例2,帶視窗圖示

視窗圖示通常是顯示在視窗的左上角,標題欄的最左邊。下面的例子就是怎麼用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還支援面向物件的程式設計:

class Example(QWidget):

    def __init__(self):
        super().__init__()
        ...

面向物件程式設計最重要的三個部分是類(class)、資料和方法。我們建立了一個類的呼叫,這個類繼承自QWidget。這就意味著,我們呼叫了兩個構造器,一個是這個類本身的,一個是這個類繼承的。super()構造器方法返回父級的物件。__init__()方法是構造器的一個方法。

self.initUI()

使用initUI()方法建立一個GUI。

# 自己準備一個web.png
self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('web.png'))

上面的三個方法都繼承自QWidget類。setGeometry()有兩個作用:把視窗放到螢幕上並且設定視窗大小。引數分別代表螢幕座標的x、y和視窗大小的寬、高。也就是說這個方法是resize()和move()的合體。最後一個方法是添加了圖示。先建立一個QIcon物件,然後接受一個路徑作為引數顯示圖示。

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
`

應用和示例的物件創立,主迴圈開始。 程式預覽:

icon

例3,提示框

#!/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_())

在這個例子中,我們為應用建立了兩個提示框。

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)

調整按鈕大小,並讓按鈕在螢幕上顯示出來,sizeHint()方法提供了一個預設的按鈕大小。

程式預覽:

tooltip

例4,關閉視窗

關閉一個視窗最直觀的方式就是點選標題欄的那個叉,這個例子裡,我們展示的是如何用程式關閉一個視窗。這裡我們將接觸到一點single和slots的知識。

本例使用的是QPushButton元件類。

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的按鈕。第一個引數是按鈕的文字,第二個引數是按鈕的父級元件,這個例子中,父級元件就是我們建立的繼承自Qwidget的Example類。

qbtn.clicked.connect(QCoreApplication.instance().quit)

事件傳遞系統在PyQt5內建的single和slot機制裡面。點選按鈕之後,訊號會被捕捉並給出既定的反應。QCoreApplication包含了事件的主迴圈,它能新增和刪除所有的事件,instance()建立了一個它的例項。QCoreApplication是在QApplication裡建立的。 點選事件和能終止程序並退出應用的quit函式繫結在了一起。在傳送者和接受者之間建立了通訊,傳送者就是按鈕,接受者就是應用物件。

程式預覽:

quitbutton

例5,訊息盒子

預設情況下,我們點選標題欄的×按鈕,QWidget就會關閉。但是有時候,我們修改預設行為。比如,如果我們開啟的是一個文字編輯器,並且做了一些修改,我們就會想在關閉按鈕的時候讓使用者進一步確認操作。

#!/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。改變空間的預設行為,就是替換掉預設的事件處理。

reply = QMessageBox.question(self, 'Message',
    "Are you sure to quit?", QMessageBox.Yes | 
    QMessageBox.No, QMessageBox.No)

我們建立了一個訊息框,上面有倆按鈕:Yes和No.第一個字串顯示在訊息框的標題欄,第二個字串顯示在對話方塊,第三個引數是訊息框的倆按鈕,最後一個引數是預設按鈕,這個按鈕是預設選中的。返回值在變數reply裡。

if reply == QtGui.QMessageBox.Yes:
    event.accept()
else:
    event.ignore()

這裡判斷返回值,如果點選的是Yes按鈕,我們就關閉元件和應用,否者就忽略關閉事件。

程式預覽:

messagebox

例6,視窗居中

#!/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()

這個方法是呼叫我們下面寫的,實現對話方塊居中的方法。

qr = self.frameGeometry()

這樣我們得到了主視窗的大小。

cp = QDesktopWidget().availableGeometry().center()

獲取到顯示器的解析度,然後得到了中間點的位置。

qr.moveCenter(cp)

然後把自己視窗的中心點放置到qr的中心點。

self.move(qr.topLeft())

然後把視窗的坐上角移動到qr的矩形的左上角上,這樣就居中了我們自己的視窗。

相關推薦

PyQt5中文基礎教程2 Hello World

Hello World 本章學習Qt的基本功能 這個簡單的小例子展示的是一個小視窗。但是我們可以在這個小視窗上面做很多事情,改變大小,最大化,最小化等,這需要很多程式碼才能實現。這在很多應用中很常見,沒必要每次都要重寫這部分程式碼,Qt已經提供了這些功能。PyQt5是一個高

PyQt5中文基礎教程7 控制元件1

控制元件就像是應用這座房子的一塊塊磚。PyQt5有很多的控制元件,比如按鈕,單選框,滑動條,複選框等等。在本章,我們將介紹一些很有用的控制元件:QCheckBox,ToggleButton,QSlider,QProgressBar和QCalendarWidget。 +

PyQt5中文基礎教程12 俄羅斯方塊遊戲

本章我們要製作一個俄羅斯方塊遊戲。 + Tetris 俄羅斯方塊遊戲是世界上最流行的遊戲之一。是由一名叫Alexey Pajitnov的俄羅斯程式設計師在1985年製作的,從那時起,這個遊戲就風靡了各個遊戲平臺。 俄羅斯方塊歸類為下落塊迷宮遊戲。遊戲有7個基本形狀:S

GStreamer基礎教程01——Hello World

目標       對於一個軟體庫來說,沒有比在螢幕上打印出Hello World更近直觀的第一印象了。因為我們是在和一個多媒體的framework打交道,所以我們準備播放一段視訊來代替Hello World。不要被下面的程式碼嚇唬住了——真正起作用的也就四行而已。剩下的都是

Gstreamer基礎教程01 - Hello World

摘要 在面對一個新的軟體庫時,第一步通常實現一個“hello world”程式,來了解庫的用法。對於GStreamer,我們可以實現一個極簡的播放器,來了解GStreamer的使用。   環境配置 為了快速掌握Gstreamer相關的知識,我們優先選擇Ubuntu作為

3.1、C#基礎 - C# 的 Hello World2

大小寫 我們 解釋 pre blog 分享 ref sharp 圖片 在上篇文章中,你跟著我寫了一個HelloWorld,本篇中,我們來談談一些C#程序中的小概念 1、C# 程序結構 一個 C# 程序主要包括以下部分: 命名空間聲明(Namespace declarati

Java基礎教程(2)--Java開發環境

特殊 .html 完成 能夠 println 個數 過程 intel 免費試用 一.JVM、JRE和JDK的概念 ??對於初學者來說,這三個術語出現的頻率很高,而且有關這它們的問題在面試題中也會經常出現。因此,理解它們的定義、區別和聯系就顯得尤為重要。在學習這幾個專業術語之

Go-Mega Web開發教程 01 - Hello World

本文Github地址: https://github.com/bonfy/go-mega 一般計算機書的開頭都是 Hello World 我們亦不能免俗,所以本章我們的任務就是完成最簡單的 Hello World 本章的GitHub連結為: Source, Zip

[雪峰磁針石部落格]python 3.7極速入門教程2 Hello與變數

Hello 命令列方式 $ python Python 3.7.0 (default, Jun 28 2018, 13:15:42) [GCC 7.2.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license

django 的基礎配置以及hello world例項

1:pip install django(我一般使用的是virtualenvwrapper建立虛擬環境,這樣有利於環境的隔離)具體看我得另外一篇部落格: 2:需要切換到你需要存放專案的目錄下:使用命令如下 django-admin startproject project_name 3:

計算機基礎教程2 - 計算機發展歷程

第一代的時期是1946年至1959年。第一代計算機使用真空管作為CPU(中央處理單元)的儲存器和電路的基本元件。這些管子,如電燈泡,產生大量的熱量,而且用於頻繁熔斷的裝置。因此,它們非常昂貴,只有大型組織能夠負擔得起。 在這一代中,主要使用批處理作業系統。打孔卡,紙帶和磁帶用作輸入和輸出裝置。這一代中的計算

彙編教程8:hello world

今天我就要帶大家走進彙編的”hello World“了,我個人覺得我寫的是比較慢的,講的有點細,寫了7篇了才寫到進入”hello World“,其實我本意是把主力放win32上的,所以我會加快進度了。 我可以想象你是絕對不會滿足於到debug上小試牛刀的,一

SpringBoot基礎教程2-1-8 資料驗證-自定義日期格式驗證

1 概述 javax.validation包與hibernate-validator包中註解能滿足大部分需求,但是還是有必要熟悉下自定義資料驗證註解,如日期格式驗證。 2 新增依賴 <

基於TensorFlow的深度學習系列教程 1——Hello World!

最近看到一份不錯的深度學習資源——Stanford中的CS20SI:《TensorFlow for Deep Learning Research》,正好跟著學習一下TensorFlow的基礎,還是收穫頗豐,隨手整理成部落格隨時翻閱。 為什麼選擇TensorFlow? 自從12年AlexNet獲得

php基礎教程——2建立模板、處理表單

一.建立模板: 將頁面中經常出現的部分複製到一個html或php檔案中,在原頁面中用require()/include()函式引入。 例子: 源html:<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional

[Linux]shell基礎教程2-傳遞引數

原創文章,歡迎轉載。轉載請註明:轉載自 祥的部落格 原文連結:https://blog.csdn.net/humanking7/article/details/84529119 文章目錄 @[toc] 環境

Ruby學習之語言特性&安裝環境&中文輸出&輸出Hello World

Ruby呢,它是一款開源的面向物件程式設計的伺服器指令碼語言,它可以執行在不同的平臺上,並且呢,它的特性和python、Perl比較相似,我們來具體看下: Ruby 是開源的,在 Web 上免費提供,但需要一個許可證。 Ruby 是一種通用的、解釋的程式語言。 Ruby 是

Python 3基礎教程2-列印語句和字串

本文介紹Python 3中的列印語句和字串使用,具體練習請看下面的demo.py print ('Hello Python 3!') """ 文字講列印語句和字串 列印語句,裡面的訊息可以用單引號或

RabbitMQ官網教程1——Hello World

        RabbitMQ是一個訊息中介軟體——接收和傳送訊息。你可以把它想象成一個郵局,當你把郵件投遞到郵箱後,你就可以確信郵遞員最終會幫你把郵件寄給收件人。 術語:         生產者——傳送訊息;         佇列:“郵箱”,存在於RabbitMQ內。雖

EhCache教程Hello World和與Spring整合

一:目錄 EhCache 簡介 Hello World 示例 Spring 整合 二: 簡介 1. 基本介紹 EhCache 是一個純Java的程序內快取框架,具有快速、精幹等特點,是Hibernate中預設Cache