亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

用PyQt進(jìn)行Python圖形界面的程序的開發(fā)的入門指引

 更新時(shí)間:2015年04月14日 15:15:20   投稿:goldensun  
這篇文章主要介紹了用PyQt進(jìn)行Python圖形界面的程序的開發(fā)的入門指引,來(lái)自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下

一般來(lái)說(shuō),選擇用于應(yīng)用程序的 GUI 工具箱會(huì)是一件棘手的事。使用 Python(許多語(yǔ)言也一樣)的程序員可以選擇的 GUI 工具箱種類繁多,而每個(gè)工具箱都有各自的優(yōu)缺點(diǎn)。有些速度比其它工具箱快,有些比較?。挥行┮子诎惭b,有些更適合于跨平臺(tái)使用(對(duì)于這一點(diǎn),還要指出,有些支持您需要滿足的特定特性)。當(dāng)然,各種庫(kù)都相應(yīng)具有各種許可證。

對(duì)于 Python 程序員而言,缺省的 GUI 選擇是 Tk(通過(guò) Tkinter 綁定)— 其原因顯而易見。Tkinter 和閑置的 IDE 是由 Python 創(chuàng)始人編寫的,它們是作為大多數(shù) Python 分發(fā)版的缺省選擇而出現(xiàn)的。標(biāo)準(zhǔn) Python 文檔討論了 Tkinter,但沒(méi)有涉及任何其它 GUI 綁定。這是故意的!至少可以這么認(rèn)為,如果 Tk 和 Tkinter 不是這么糟糕,程序員就沒(méi)有理由去尋找替代品了。要誘導(dǎo) Python 程序員放棄缺省選擇,那么工具箱必須提供額外的東西。PyQt 就是這樣一個(gè)工具箱。

PyQt 所具有的優(yōu)點(diǎn)遠(yuǎn)遠(yuǎn)超過(guò)了 Tkinter(它也有幾個(gè)缺點(diǎn))。Qt 和 PyQt 速度都很快;Qt 和 PyQt 的設(shè)計(jì)完全是面向?qū)ο蟮?;Qt 提供了一個(gè)設(shè)計(jì)良好的窗口構(gòu)件集合,它比 Tk 所提供的要大得多。就其缺點(diǎn)而言,Qt 的許可證受到的限制比許多工具箱(至少在非 Linux 平臺(tái)方面)都多;正確安裝 Qt 和 PyQt 常常會(huì)很復(fù)雜;另外,Qt 是一個(gè)相當(dāng)大的庫(kù)。PyQt 應(yīng)用程序的用戶將需要設(shè)法完成安裝 Qt 和 PyQt,這使分發(fā)變得很困難。(請(qǐng)閱讀本文后面的 用于其它語(yǔ)言的 Qt 綁定。)

PyQt 嚴(yán)格遵循 Qt 的發(fā)放許可。特別是,它可用于 UNIX/X11 平臺(tái)上的 GPL,并可用于 Zaurus 上的 Qt Palmtop Environment 環(huán)境,還存在用于較老的 Qt 版本的免費(fèi)(free-as-in-free-beer)Windows 軟件包。PyQt 的商業(yè)許可證可用于 Windows。

對(duì)于本文而言,PyQt 有一個(gè)方面優(yōu)于許多其它工具箱,它值得我們特別關(guān)注。Qt 使用一種稱為 信號(hào)/插槽(signals/slots)的機(jī)制在窗口構(gòu)件(以及其它對(duì)象)之間傳遞事件和消息。這種機(jī)制完全不同于包括 Tkinter 在內(nèi)的大多數(shù)工具箱所用的回調(diào)(callback)機(jī)制。使用信號(hào)/插槽以靈活且可維護(hù)的方式控制對(duì)象間通信要比使用脆弱的回調(diào)風(fēng)格容易得多。應(yīng)用程序越大,Qt 的這個(gè)優(yōu)勢(shì)就越重要。

本文的作者之一 Boudewijn Rempt 已經(jīng)出版了一本有關(guān)使用 PyQt 進(jìn)行應(yīng)用程序開發(fā)的書籍。 GUI Programming with Python: QT Edition(請(qǐng)參閱 參考資料)顯示了如何設(shè)計(jì)和開發(fā)完整的 GUI 應(yīng)用程序,其中包括從最初的構(gòu)思到分發(fā)的全過(guò)程。
樣本應(yīng)用程序

要顯示信號(hào)/插槽和回調(diào)之間的反差,我們提供了一個(gè)寫著玩玩的應(yīng)用程序,它使用 Tkinter 和 PyQt。盡管實(shí)際上 PyQt 版本對(duì)于這個(gè)基本程序并不更簡(jiǎn)單,但是它已經(jīng)演示了 PyQt 應(yīng)用程序更好的模塊性和可維護(hù)性。

應(yīng)用程序包括四個(gè)窗口構(gòu)件:

  1.     “Quit”按鈕(用來(lái)與整個(gè)應(yīng)用程序通信)
  2.     “Log Timestamp”按鈕(用于窗口構(gòu)件間的消息)
  3.     文本區(qū)域,顯示可滾動(dòng)的已記錄日志的時(shí)間戳記列表
  4.     消息窗口構(gòu)件,顯示已記錄日志的時(shí)間戳記數(shù)

在 Tkinter 中,我們可以這樣實(shí)現(xiàn)應(yīng)用程序:

清單 1. Logger.py Tkinter 應(yīng)用程序

  #!/usr/bin/python
import sys, time
from Tkinter import *
class Logger(Frame):
  def __init__(self):
    Frame.__init__(self)
    self.pack(expand=YES, fill=BOTH)
    self.master.title("Timestamp logging application")
    self.tslist = []
    self.tsdisp = Text(height=6, width=25)
    self.count = StringVar()
    self.cntdisp = Message(font=('Sans',24),
                textvariable=self.count)
    self.log = Button(text="Log Timestamp",
             command=self.log_timestamp)
    self.quit = Button(text="Quit", command=sys.exit)
    self.tsdisp.pack(side=LEFT)
    self.cntdisp.pack()
    self.log.pack(side=TOP, expand=YES, fill=BOTH)
    self.quit.pack(side=BOTTOM, fill=BOTH)
  def log_timestamp(self):
    stamp = time.ctime()
    self.tsdisp.insert(END, stamp+"\n")
    self.tsdisp.see(END)
    self.tslist.append(stamp)
    self.count.set("% 3d" % len(self.tslist))
if __name__=='__main__':
  Logger().mainloop()

這個(gè) Tk 版本使用了 log_timestamp() 方法作為按鈕的 command= 參數(shù)。 這個(gè)方法需要依次單獨(dú)操作它要影響的所有窗口構(gòu)件。如果我們想更改按鈕按下的效果(例如還要記錄時(shí)間戳記),那么這個(gè)風(fēng)格就很脆弱。通過(guò)繼承您可以實(shí)現(xiàn)這一點(diǎn):

清單 2. StdOutLogger.py Tkinter 增強(qiáng)

    class StdOutLogger(Logger):
  def log_timestamp(self):
    Logger.log_timestamp(self)
    print self.tslist[-1]

但是這個(gè)子類的作者需要相當(dāng)精確地理解 Logger.log_timestamp() 已經(jīng)做了什么;而且除非通過(guò)在子類中完全重寫 .log_timestamp() 方法并且不調(diào)用父方法,否則沒(méi)有辦法 除去消息。

一個(gè)非?;镜?PyQt 應(yīng)用程序總有一些樣本代碼,這些代碼在哪里都相同,Tkinter 代碼也是這樣。但是,當(dāng)我們進(jìn)一步研究設(shè)置應(yīng)用程序所需的代碼,以及顯示窗口構(gòu)件的代碼時(shí),區(qū)別就顯現(xiàn)出來(lái)了。

清單 3. logger-qt.py PyQt 應(yīng)用程序

 

  #!/usr/bin/env python
import sys, time
from qt import * # Generally advertised as safe
class Logger(QWidget):
  def __init__(self, *args):
    QWidget.__init__(self, *args)
    self.setCaption("Timestamp logging application")
    self.layout = QGridLayout(self, 3, 2, 5, 10)
    self.tsdisp = QTextEdit(self)
    self.tsdisp.setMinimumSize(250, 300)
    self.tsdisp.setTextFormat(Qt.PlainText)
    self.tscount = QLabel("", self)
    self.tscount.setFont(QFont("Sans", 24))
    self.log = QPushButton("&Log Timestamp", self)
    self.quit = QPushButton("&Quit", self)
    self.layout.addMultiCellWidget(self.tsdisp, 0, 2, 0, 0)
    self.layout.addWidget(self.tscount, 0, 1)
    self.layout.addWidget(self.log, 1, 1)
    self.layout.addWidget(self.quit, 2, 1)
    self.connect(self.log, SIGNAL("clicked()"),
           self.log_timestamp)
    self.connect(self.quit, SIGNAL("clicked()"),
           self.close)
  def log_timestamp(self):
    stamp = time.ctime()
    self.tsdisp.append(stamp)
    self.tscount.setText(str(self.tsdisp.lines()))
if __name__ == "__main__":
  app = QApplication(sys.argv)
  app.connect(app, SIGNAL('lastWindowClosed()'), app,
         SLOT('quit()'))
  logger = Logger()
  logger.show()
  app.setMainWidget(logger)
  app.exec_loop()

通過(guò)創(chuàng)建布局管理器, Logger 類開始工作了。布局管理器在任何 GUI 系統(tǒng)中都是一個(gè)很復(fù)雜的主題,但是 Qt 的實(shí)現(xiàn)使之變得簡(jiǎn)單。在大多數(shù)情況下,您會(huì)使用 Qt Designer 創(chuàng)建一般的 GUI 設(shè)計(jì),隨后可將它用于生成 Python 或 C++ 代碼。然后您可以使生成的代碼生成子類,以添加功能。

但是在這個(gè)示例中,我們選擇手工創(chuàng)建布局管理器。窗口構(gòu)件被置于網(wǎng)格的各個(gè)單元中,或者可以跨多個(gè)單元放置。在 Tkinter 需要命名參數(shù)的地方,PyQt 就不允許它們。這是一個(gè)很重要的差異,它經(jīng)常會(huì)使在兩種環(huán)境中工作的人們無(wú)所適從。

所有 Qt 窗口構(gòu)件都可以和 QString 對(duì)象很自然地一起工作,而不能和 Python 字符串或 Unicode 對(duì)象一起工作。幸運(yùn)的是,轉(zhuǎn)換是自動(dòng)的。如果您在 Qt 方法中使用了字符串或 Unicode 參數(shù),那么它將自動(dòng)轉(zhuǎn)換成 QString。不能進(jìn)行反向轉(zhuǎn)換:如果您調(diào)用了一個(gè)返回 QString 的方法,那么您獲得的是 QString。

應(yīng)用程序中最有趣的部分是我們將 clicked 信號(hào)連接到功能的位置。一個(gè)按鈕連接到了 log_timestamp 方法;另一個(gè)連接到了 QWidget 類的 close 方法。
圖 1. logger-qt 的屏幕快照
logger-qt 的屏幕快照

2015414151505306.jpg (385×336)

現(xiàn)在我們想將日志記錄添加到這個(gè)應(yīng)用程序的標(biāo)準(zhǔn)輸出。 這十分容易。我們可以使 Logger 類生成子類,或者為了演示,創(chuàng)建簡(jiǎn)單的獨(dú)立函數(shù):

清單 4. logger-qt.py PyQt 增強(qiáng)

  def logwrite():
  print(time.ctime())
if __name__ == "__main__":
  app = QApplication(sys.argv)
  app.connect(app, SIGNAL('lastWindowClosed()'), app,
        SLOT('quit()'))
  logger = Logger()
  QObject.connect(logger.log, SIGNAL("clicked()"), logwrite)
  logger.show()
  app.setMainWidget(logger)
  app.exec_loop()

從上述代碼我們可以看到,這就是將 log QPushButton 的 clicked() 信號(hào)連接到新函數(shù)的事情。注:信號(hào)也可以將任何數(shù)據(jù)傳送到它們所連接的插槽,盡管在這里我們沒(méi)有顯示這樣的示例。

如果您不想調(diào)用原始方法,那么可以從插槽 disconnect 信號(hào),例如通過(guò)在 logger.show() 行之前添加以下行:

清單 5. logger-qt.py PyQt 增強(qiáng)

          QObject.disconnect(logger.log, SIGNAL("clicked()"),
          logger.log_timestamp)

現(xiàn)在將不再更新 GUI。

用于 Python 的其它 GUI 綁定

PyQt 在給定實(shí)例中可能不是很有用,可能是許可證狀態(tài)問(wèn)題,也可能是平臺(tái)可用性問(wèn)題(或者,可能因?yàn)樵俜职l(fā)很困難,例如大小很大)。由于這個(gè)原因(也為了比較),我們想指出一些用于 Python 的其它流行 GUI 工具箱。

    Anygui
    Anygui 實(shí)際上不是 GUI 工具箱,而是一個(gè)作用于大量工具箱(甚至是令人驚奇的象 curses 和 Java/Jython Swing 那樣的工具箱)的抽象包裝器。在編程風(fēng)格方面,使用 Anygui 類似于使用 Tkinter,但是要選中這個(gè)底層工具箱,要么自動(dòng)進(jìn)行,要么進(jìn)行配置調(diào)用。Anygui 很好用,因?yàn)樗试S應(yīng)用程序未經(jīng)更改就可以運(yùn)行在差異很大的平臺(tái)上(但因此它支持受支持工具箱的“最低級(jí)公共特性”)。
    PyGTK
    PyGTK 綁定包裝了 GPL 下使用的 GTK 工具箱,它是流行的 Gnome 環(huán)境的基礎(chǔ)。GTK 在根本上是 X Window 工具箱,但是它還有 Win32 的 beta 級(jí)支持和 BeOS 的 alpha 級(jí)支持。在常規(guī)范例中,PyGTK 對(duì)窗口構(gòu)件使用回調(diào)。綁定存在于 GTK 和 大量編程語(yǔ)言之間,而不僅僅是 Qt,或甚至是 Tk。
    FXPy
    Python 綁定 FXPy 包裝了 FOX 工具箱。FOX 工具箱已經(jīng)被移植到大多數(shù)類 UNIX 平臺(tái)上,以及 Win32 上。 與大多數(shù)工具箱類似,F(xiàn)OX 和 FXPy 都使用回調(diào)范例。FOX 由 LGPL 特許。
    wxPython
    這個(gè)綁定包裝了 wxWindows 工具箱。 與 FOX 或 GTK 類似,wxWindows 被移植到 Win32 和類 UNIX 平臺(tái)上(但是沒(méi)有移植到 MacOS、OS/2、BeOS 或其它“次要”平臺(tái)上 — 盡管它對(duì) MacOSX 的支持是 alpha 級(jí)的)。在范例方面,wxPython 接近回調(diào)風(fēng)格。wxPython 對(duì)繼承結(jié)構(gòu)的關(guān)注程度高于大多數(shù)其它工具箱,而且它使用“事件”,而不是回調(diào)。但是本質(zhì)上,事件仍舊被連接到單個(gè)方法上,隨后可能需要作用于各種窗口構(gòu)件。
    win32ui
    win32ui 屬于 win32all 軟件包,它包裝了 MFC 類。很顯然,這個(gè)工具箱是特定于 Win32 的庫(kù)。MFC 實(shí)際上不只是 GUI 工具箱,它還使用各種范例的混合。對(duì)于想創(chuàng)建 Windows 應(yīng)用程序的讀者而言,與其它工具箱相比,win32ui 會(huì)讓您“更接近于實(shí)質(zhì)”。

從其它語(yǔ)言使用 Qt

如同 Python,從大量其它編程語(yǔ)言使用 Qt 工具箱是可能的。如果可以自由選擇,我們會(huì)首選 Python,而不是其它語(yǔ)言。諸如公司政策以及與其它代碼庫(kù)連接之類的外部約束可以決定編程語(yǔ)言的選擇。Qt 的原始語(yǔ)言是 C++,但也有用于 C、Java、Perl 和 Ruby 的綁定。就與 Python 示例的比較而言,讓我們討論一下用 Ruby 和 Java 寫著玩玩的應(yīng)用程序。

Ruby/Qt 在用法上十分類似于 PyQt。這兩種語(yǔ)言具有相似的動(dòng)態(tài)性和簡(jiǎn)明性,所以除了拼寫上的差別外,其代碼很類似:

清單 6. HelloWorld.rb Qt2 應(yīng)用程序

#!/usr/local/bin/ruby
require 'qt2'
include Qt2
a = QApplication.new([$0] + ARGV)
hello = QPushButton.new('Hello world!')
hello.resize(100, 30)
a.connect( hello, QSIGNAL('clicked()'), a, QSLOT('quit()'))
a.setMainWidget(hello)
hello.show
a.exec

Java 總是比腳本編制語(yǔ)言要冗長(zhǎng)一點(diǎn),但是基本部分都相同。一個(gè)同等功能的最小 qtjava 應(yīng)用程序類似于:

清單 7. HelloWorld.java Qt2 應(yīng)用程序

import org.kde.qt.*;
public class HelloWorld {
 public static void main(String[] args)
 {
  QApplication myapp = new QApplication(args);
  QPushButton hello = new QPushButton("Hello World", null);
  hello.resize(100,30);
  myapp.connect(hello, SIGNAL("clicked"),
         this, SLOT("quit()"));
  myapp.setMainWidget(hello);
  hello.show();
  myapp.exec();
  return;
 }
 static {
  System.loadLibrary("qtjava");
  try {
    Class c = Class.forName("org.kde.qt.qtjava");
  } catch (Exception e) {
    System.out.println("Can't load qtjava class");
  }
 }
}

PyQt 是一個(gè)吸引人和快速的接口,它將 Qt 工具箱和 Python 編程語(yǔ)言集成在一起。除了該工具箱提供的種類繁多的窗口構(gòu)件外,Qt 所用的信號(hào)/插槽編程風(fēng)格在生產(chǎn)能力和可維護(hù)性方面都要優(yōu)于大多數(shù)其它 GUI 工具箱所用的回調(diào)風(fēng)格。

相關(guān)文章

  • 基于Python實(shí)現(xiàn)迪杰斯特拉和弗洛伊德算法

    基于Python實(shí)現(xiàn)迪杰斯特拉和弗洛伊德算法

    這篇文章主要為大家詳細(xì)介紹了基于Python實(shí)現(xiàn)迪杰斯特拉和弗洛伊德算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Linux下用Python腳本監(jiān)控目錄變化代碼分享

    Linux下用Python腳本監(jiān)控目錄變化代碼分享

    這篇文章主要介紹了Linux下用Python腳本監(jiān)控目錄變化代碼分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-05-05
  • python中實(shí)現(xiàn)指定時(shí)間調(diào)用函數(shù)示例代碼

    python中實(shí)現(xiàn)指定時(shí)間調(diào)用函數(shù)示例代碼

    函數(shù)function是python編程核心內(nèi)容之一,也是比較重要的一塊。下面這篇文章主要給大家介紹了關(guān)于python中實(shí)現(xiàn)指定時(shí)間調(diào)用函數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-09-09
  • 使用python從三個(gè)角度解決josephus問(wèn)題的方法

    使用python從三個(gè)角度解決josephus問(wèn)題的方法

    這篇文章主要介紹了使用python從三個(gè)角度解決josephus問(wèn)題的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Pytest?fixture及conftest相關(guān)詳解

    Pytest?fixture及conftest相關(guān)詳解

    這篇文章主要介紹了Pytest?fixture及conftest相關(guān)詳解,fixture是在測(cè)試函數(shù)運(yùn)行前后,由pytest執(zhí)行的外殼函數(shù),更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-09-09
  • python查詢文件夾下excel的sheet名代碼實(shí)例

    python查詢文件夾下excel的sheet名代碼實(shí)例

    這篇文章主要介紹了python查詢文件夾下excel的sheet名方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 零基礎(chǔ)學(xué)Python(一)Python環(huán)境安裝

    零基礎(chǔ)學(xué)Python(一)Python環(huán)境安裝

    本文是此系列的第一篇,所以開始先胡扯一番,然后再分別介紹LINUX系統(tǒng),windows系統(tǒng),MAC系統(tǒng)下如何安裝Python環(huán)境,希望對(duì)大家有所幫助
    2014-08-08
  • python如何基于redis實(shí)現(xiàn)ip代理池

    python如何基于redis實(shí)現(xiàn)ip代理池

    這篇文章主要介紹了python如何基于redis實(shí)現(xiàn)ip代理池,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Python實(shí)現(xiàn)語(yǔ)音識(shí)別vosk的示例代碼

    Python實(shí)現(xiàn)語(yǔ)音識(shí)別vosk的示例代碼

    Vosk是一個(gè)功能強(qiáng)大且易于使用的語(yǔ)音識(shí)別工具包,它提供了Python綁定,使得在Python中使用Vosk變得非常方便,本文主要介紹了Python實(shí)現(xiàn)語(yǔ)音識(shí)別vosk的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 詳解Python sys.argv使用方法

    詳解Python sys.argv使用方法

    在本文中我們給大家詳細(xì)講解了關(guān)于Python sys.argv使用方法以及注意事項(xiàng),有此需要的讀者們跟著學(xué)習(xí)下。
    2019-05-05

最新評(píng)論