pyqt5

https://maicss.gitbooks.io/pyqt5/content/hello_world.html

本章學(xué)習(xí)Qt的基本功能

例1,簡(jiǎn)單的窗口

這個(gè)簡(jiǎn)單的小例子展示的是一個(gè)小窗口沼填。但是我們可以在這個(gè)小窗口上面做很多事情倦始,改變大小,最大化脆炎,最小化等,這需要很多代碼才能實(shí)現(xiàn)秒裕。這在很多應(yīng)用中很常見(jiàn),沒(méi)必要每次都要重寫(xiě)這部分代碼喇潘,Qt已經(jīng)提供了這些功能。PyQt5是一個(gè)高級(jí)的工具集合颖低,相比使用低級(jí)的工具弧烤,能省略上百行代碼。

#!/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: August 2017
"""

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_())

運(yùn)行上面的代碼,能展示出一個(gè)小窗口莺戒。

import sys
from PyQt5.QtWidgets import QApplication, QWidget

這里引入了PyQt5.QtWidgets模塊,這個(gè)模塊包含了基本的組件闹究。

app = QApplication(sys.argv)

每個(gè)PyQt5應(yīng)用都必須創(chuàng)建一個(gè)應(yīng)用對(duì)象。sys.argv是一組命令行參數(shù)的列表食店。Python可以在shell里運(yùn)行渣淤,這個(gè)參數(shù)提供對(duì)腳本控制的功能。

w = QWidget()

QWidge控件是一個(gè)用戶(hù)界面的基本控件吉嫩,它提供了基本的應(yīng)用構(gòu)造器价认。默認(rèn)情況下,構(gòu)造器是沒(méi)有父級(jí)的自娩,沒(méi)有父級(jí)的構(gòu)造器被稱(chēng)為窗口(window)用踩。

w.resize(250, 150)

resize()方法能改變控件的大小,這里的意思是窗口寬250px忙迁,高150px脐彩。

w.move(300, 300)

move()是修改控件位置的的方法。它把控件放置到屏幕坐標(biāo)的(300, 300)的位置姊扔。注:屏幕坐標(biāo)系的原點(diǎn)是屏幕的左上角惠奸。

w.setWindowTitle('Simple')

我們給這個(gè)窗口添加了一個(gè)標(biāo)題,標(biāo)題在標(biāo)題欄展示(雖然這看起來(lái)是一句廢話(huà)恰梢,但是后面還有各種欄佛南,還是要注意一下,多了就蒙了)嵌言。

w.show()

show()能讓控件在桌面上顯示出來(lái)嗅回。控件在內(nèi)存里創(chuàng)建摧茴,之后才能在顯示器上顯示出來(lái)绵载。

sys.exit(app.exec_())

最后,我們進(jìn)入了應(yīng)用的主循環(huán)中蓬蝶,事件處理器這個(gè)時(shí)候開(kāi)始工作尘分。主循環(huán)從窗口上接收事件,并把事件傳入到派發(fā)到應(yīng)用控件里丸氛。當(dāng)調(diào)用exit()方法或直接銷(xiāo)毀主控件時(shí),主循環(huán)就會(huì)結(jié)束著摔。sys.exit()方法能確保主循環(huán)安全退出缓窜。外部環(huán)境能通知主控件怎么結(jié)束。

exec_()之所以有個(gè)下劃線(xiàn),是因?yàn)?code>exec是一個(gè)Python的關(guān)鍵字私股。

程序預(yù)覽:

simple

例2倡鲸,帶窗口圖標(biāo)

窗口圖標(biāo)通常是顯示在窗口的左上角峭状,標(biāo)題欄的最左邊优床。下面的例子就是怎么用PyQt5創(chuàng)建一個(gè)這樣的窗口胆敞。

在某些環(huán)境下移层,圖標(biāo)顯示不出來(lái)幽钢。如果你遇到了這個(gè)問(wèn)題匪燕,看我在Stackoverfolw的回答

#!/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: August 2017
"""

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_())

前一個(gè)例子是使用的過(guò)程式編程。Python還支持面向?qū)ο?/a>的編程:

class Example(QWidget):

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

面向?qū)ο缶幊套钪匾娜齻€(gè)部分是類(lèi)(class)书闸、數(shù)據(jù)和方法嫌术。我們創(chuàng)建了一個(gè)類(lèi)的調(diào)用度气,這個(gè)類(lèi)繼承自QWidget膨报。這就意味著,我們調(diào)用了兩個(gè)構(gòu)造器弛矛,一個(gè)是這個(gè)類(lèi)本身的丈氓,一個(gè)是這個(gè)類(lèi)繼承的万俗。super()構(gòu)造器方法返回父級(jí)的對(duì)象该编。__init__()方法是構(gòu)造器的一個(gè)方法课竣。

self.initUI()

使用initUI()方法創(chuàng)建一個(gè)GUI于樟。

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

上面的三個(gè)方法都繼承自QWidget類(lèi)拇囊。setGeometry()有兩個(gè)作用:把窗口放到屏幕上并且設(shè)置窗口大小寥袭。參數(shù)分別代表屏幕坐標(biāo)的x传黄、y和窗口大小的寬膘掰、高识埋。也就是說(shuō)這個(gè)方法是resize()move()的合體。最后一個(gè)方法是添加了圖標(biāo)系忙。先創(chuàng)建一個(gè)QIcon對(duì)象笨觅,然后接受一個(gè)路徑作為參數(shù)顯示圖標(biāo)见剩。

if __name__ == '__main__':

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

應(yīng)用和示例的對(duì)象創(chuàng)立扫俺,主循環(huán)開(kāi)始狼纬。

程序預(yù)覽:

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: August 2017
"""

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_())

在這個(gè)例子中凑耻,我們?yōu)閼?yīng)用創(chuàng)建了一個(gè)提示框香浩。

QToolTip.setFont(QFont('SansSerif', 10))

這個(gè)靜態(tài)方法設(shè)置了提示框的字體邻吭,我們使用了10px的SansSerif字體囱晴。

self.setToolTip('This is a <b>QWidget</b> widget')

調(diào)用setTooltip()創(chuàng)建提示框可以使用富文本格式的內(nèi)容畸写。

btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')

創(chuàng)建一個(gè)按鈕艺糜,并且為按鈕添加了一個(gè)提示框破停。

btn.resize(btn.sizeHint())
btn.move(50, 50)

調(diào)整按鈕大小真慢,并讓按鈕在屏幕上顯示出來(lái)理茎,sizeHint()方法提供了一個(gè)默認(rèn)的按鈕大小。

程序預(yù)覽:

tooltip

例4蚯撩,關(guān)閉窗口

關(guān)閉一個(gè)窗口最直觀(guān)的方式就是點(diǎn)擊標(biāo)題欄的那個(gè)叉胎挎,這個(gè)例子里犹菇,我們展示的是如何用程序關(guān)閉一個(gè)窗口揭芍。這里我們將接觸到一點(diǎn)single和slots的知識(shí)卸例。

本例使用的是QPushButton組件類(lèi)币厕。

QPushButton(string text, QWidget parent = None)

text參數(shù)是想要顯示的按鈕名稱(chēng)旦装,parent參數(shù)是放在按鈕上的組件阴绢,在我們的 例子里呻袭,這個(gè)參數(shù)是QWidget左电。應(yīng)用中的組件都是一層一層(繼承而來(lái)的篓足?)的栈拖,在這個(gè)層里涩哟,大部分的組件都有自己的父級(jí),沒(méi)有父級(jí)的組件潜腻,是頂級(jí)的窗口蝌箍。

#!/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: August 2017
"""

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_())

這里創(chuàng)建了一個(gè)點(diǎn)擊之后就退出窗口的按鈕。

from PyQt5.QtCore import QCoreApplication

程序需要QtCore對(duì)象专普。

qbtn = QPushButton('Quit', self)

創(chuàng)建一個(gè)繼承自QPushButton的按鈕檀夹。第一個(gè)參數(shù)是按鈕的文本炸渡,第二個(gè)參數(shù)是按鈕的父級(jí)組件蚌堵,這個(gè)例子中沛婴,父級(jí)組件就是我們創(chuàng)建的繼承自QwidgetExample類(lèi)泻蚊。

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

事件傳遞系統(tǒng)在PyQt5內(nèi)建的single和slot機(jī)制里面性雄。點(diǎn)擊按鈕之后秒旋,信號(hào)會(huì)被捕捉并給出既定的反應(yīng)滩褥。QCoreApplication包含了事件的主循環(huán)铺然,它能添加和刪除所有的事件魄健,instance()創(chuàng)建了一個(gè)它的實(shí)例沽瘦。QCoreApplication是在QApplication里創(chuàng)建的析恋。 點(diǎn)擊事件和能終止進(jìn)程并退出應(yīng)用的quit函數(shù)綁定在了一起助隧。在發(fā)送者和接受者之間建立了通訊,發(fā)送者就是按鈕滓技,接受者就是應(yīng)用對(duì)象膝昆。

程序預(yù)覽:

quitbutton

例5,消息盒子

默認(rèn)情況下洗显,我們點(diǎn)擊標(biāo)題欄的×按鈕外潜,QWidget就會(huì)關(guān)閉。但是有時(shí)候挠唆,我們修改默認(rèn)行為处窥。比如,如果我們打開(kāi)的是一個(gè)文本編輯器玄组,并且做了一些修改滔驾,我們就會(huì)想在關(guān)閉按鈕的時(shí)候讓用戶(hù)進(jìn)一步確認(rèn)操作。

#!/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: August 2017
"""

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_())

如果關(guān)閉QWidget俄讹,就會(huì)產(chǎn)生一個(gè)QCloseEvent。改變控件的默認(rèn)行為,就是替換掉默認(rèn)的事件處理臣咖。

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

我們創(chuàng)建了一個(gè)消息框酣胀,上面有倆按鈕:Yes和No.第一個(gè)字符串顯示在消息框的標(biāo)題欄儒溉,第二個(gè)字符串顯示在對(duì)話(huà)框涛碑,第三個(gè)參數(shù)是消息框的倆按鈕瘫证,最后一個(gè)參數(shù)是默認(rèn)按鈕,這個(gè)按鈕是默認(rèn)選中的么抗。返回值在變量reply里。

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

這里判斷返回值,如果點(diǎn)擊的是Yes按鈕,我們就關(guān)閉組件和應(yīng)用,否者就忽略關(guān)閉事件。

程序預(yù)覽:

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: August 2017
"""

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提供了用戶(hù)的桌面信息锄奢,包括屏幕的大小。

self.center()

這個(gè)方法是調(diào)用我們下面寫(xiě)的,實(shí)現(xiàn)對(duì)話(huà)框居中的方法。

qr = self.frameGeometry()

得到了主窗口的大小。

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

獲取顯示器的分辨率,然后得到中間點(diǎn)的位置伶棒。

qr.moveCenter(cp)

然后把自己窗口的中心點(diǎn)放置到qr的中心點(diǎn)宛渐。

self.move(qr.topLeft())

然后把窗口的坐上角的坐標(biāo)設(shè)置為qr的矩形左上角的坐標(biāo)叨襟,這樣就把窗口居中了提澎。

程序預(yù)覽:

center
  • 序言:七十年代末川慌,一起剝皮案震驚了整個(gè)濱河市降瞳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搓侄,老刑警劉巖云石,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仰楚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡举反,警方通過(guò)查閱死者的電腦和手機(jī)室囊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)鹏控,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人寺晌,你說(shuō)我怎么就攤上這事陆赋〕炒希” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵恕稠,是天一觀(guān)的道長(zhǎng)琅绅。 經(jīng)常有香客問(wèn)我,道長(zhǎng)鹅巍,這世上最難降的妖魔是什么千扶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮骆捧,結(jié)果婚禮上澎羞,老公的妹妹穿的比我還像新娘。我一直安慰自己敛苇,他們只是感情好妆绞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著枫攀,像睡著了一般括饶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上来涨,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天图焰,我揣著相機(jī)與錄音,去河邊找鬼蹦掐。 笑死技羔,一個(gè)胖子當(dāng)著我的面吹牛僵闯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播藤滥,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鳖粟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了超陆?” 一聲冷哼從身側(cè)響起牺弹,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎时呀,沒(méi)想到半個(gè)月后张漂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谨娜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年航攒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趴梢。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡漠畜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坞靶,到底是詐尸還是另有隱情憔狞,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布彰阴,位于F島的核電站瘾敢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尿这。R本人自食惡果不足惜簇抵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望射众。 院中可真熱鬧碟摆,春花似錦、人聲如沸叨橱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)罗洗。三九已至嘉裤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間栖博,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工厢洞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仇让,地道東北人典奉。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像丧叽,于是被迫代替她去往敵國(guó)和親卫玖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 本章學(xué)習(xí)Qt的基本功能 例1,簡(jiǎn)單的窗口 這個(gè)簡(jiǎn)單的小例子展示的是一個(gè)小窗口迂尝。但是我們可以在這個(gè)小窗口上面做很多事...
    派派森森閱讀 59,976評(píng)論 1 17
  • 一脱茉、窗口控件 如果是主窗口,用QmainWindow類(lèi)垄开; 如果是對(duì)話(huà)框琴许,就用Qdialog類(lèi); 如果不確定溉躲,或者可...
    2e07917c964c閱讀 11,412評(píng)論 0 15
  • 創(chuàng)建第一個(gè)GUI界面 首先榜田,我們使用pyqt5的窗口小部件創(chuàng)建一個(gè)最基本的GUI: 在上面的程序中,我們首先引用了...
    JackHCC閱讀 3,061評(píng)論 0 7
  • 控件1 控件就像是應(yīng)用這座房子的一塊塊磚锻梳。PyQt5有很多的控件箭券,比如按鈕,單選框疑枯,滑動(dòng)條辩块,復(fù)選框等等。在本章神汹,我...
    派派森森閱讀 827評(píng)論 0 1
  • 文\向陽(yáng)花開(kāi) 誰(shuí)能靠得灼ㄎ骸滔以?又能依靠誰(shuí)呢? 從小到大氓拼,依靠過(guò)的人從來(lái)只有默默支持的父母你画。除此,...
    暗香盈袖閱讀 441評(píng)論 4 9