2009年4月23日

[PyQt 教學] Part 7: 聚砂成塔

[PyQt 教學] Part 6: 物件導向的寫法

一路走來,盡係寫些拉雞程式。沒關係,打好基礎後就可以準備擺脫這坨窩囊鳥氣啦 =3=

這次寫個線上字典查閱程式。是的,它會跑去讀取 Yahoo! 奇摩字典 並顯示查詢的單字結果...... 用一種異常偷吃步的方法 =.=

( code )

#!/usr/bin/env python

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *

class Dictionary(QWidget):

    def __init__(self, parent = None):
        super(Dictionary, self).__init__(parent)
        self.createLayout()
        self.createConnection()

    def search(self):
        baseUrl = "http://tw.dictionary.yahoo.com/search?ei=UTF-8&p="
        word = self.lineEdit.text()
        url = QUrl(baseUrl + word)
        self.webView.load(url)

    def createLayout(self):
        self.lineEdit = QLineEdit()
        self.goButton = QPushButton("&GO")
        h1 = QHBoxLayout()
        h1.addWidget(self.lineEdit)
        h1.addWidget(self.goButton)

        self.webView = QWebView()

        self.quitButton = QPushButton("&Quit")
        h2 = QHBoxLayout()
        h2.addStretch(1)
        h2.addWidget(self.quitButton)

        layout = QVBoxLayout()
        layout.addLayout(h1)
        layout.addWidget(self.webView)
        layout.addLayout(h2)

        self.setLayout(layout)

    def createConnection(self):
        self.lineEdit.returnPressed.connect(self.search)
        self.lineEdit.returnPressed.connect(self.lineEdit.selectAll)
        self.goButton.clicked.connect(self.search)
        self.goButton.clicked.connect(self.lineEdit.selectAll)
        self.quitButton.clicked.connect(self.close)


app = QApplication(sys.argv)

dictionary = Dictionary()
dictionary.show()

app.exec_()

沒錯,60 行不到的程式就可以完成這份單字查找的艱鉅任務了。讓我們稍微瞭解一下:
經觀察可知 Yahoo! 字典的查詢網址都是很規律的字串組合;這個程式就利用這一點,直接載入目標網址。memfunc search() 和 connect 的部份是核心,其它都沒啥特別的。

第 4 行:導入 PyQt4.QtCore 以使用 QUrl class。
第 6 行:導入 PyQt4.QtWebKit 以使用 QWebView class。這個 widget 能用來檢視網頁。
第 16~18 行:調用 search() 後,將 lineEdit 中輸入的文字與 Yahoo! 字典的查詢網址結合成新的 URL。
第 19 行:讓 webView 載入 URL 並顯示。
第 43 + 45 行:在 lineEdit 中輸入 Enter 或點擊 goButton 時調用 search()
第 44 + 46 行:調用 search() 後保持 lineEdit 中的文字在被選取狀態,以便下次輸入查詢。

其中最 imba 的莫過於第 19 行...... N 個願望一次滿足,高抽象度讓人們得以站在超高的巨人肩膀上吹風 =3=


熟悉整個 framework 之後,寫這樣的程式需要多久呢?其實只要 10 分鐘就可以完成了...... 就和一個 JavaScript booklet 同樣簡單。
基本功練完後,接下來就是自行深入啦!下一篇講查閱 API 的方法 =3=/

→ [PyQt 教學] Part 8: ???

10 則留言:

  1. 很好很強大的教學2009年9月19日 晚上11:58:00

    謝謝喔
    這是一篇很好很強大的教學
    查字典對沒有dreye的人很好用喔

    回覆刪除
  2. 教學寫的真好. 簡短又抓住核心,
    感覺上很快就能上手...

    期待 下一篇講查閱 API 的方法
    這樣就可以開始作工....

    回覆刪除
  3. 好想知道什麼時候出Part 8

    回覆刪除
    回覆
    1. 抱歉啊... 這爛尾樓都拖那麼久了,不太可能囉
      寫文章的熱誠一過 真的就回不來了...

      其它要做的就是一直查 Qt 文檔,自動從 C++ 轉換成 Python
      然後看安裝 PyQt 時附的 Demo,它的所有範例程式都已經用 PyQt 重寫了

      想看書學的話,就是那本《Rapid GUI Programming with Python and Qt》啦
      至於我個人的學習重心要轉向 HTML5 + JavaScript 囉~

      刪除
  4. 1.你好!想請教一下除了eric-ide以外,還有沒有其它比較好灌的python ide工具?
    我在公司使用centOS 5.8沒有網路可以使用yum安裝相關套件,不知道有沒有比較好安裝的python ide工具?

    2.我想請問一下,我想產生一個陣列,內容為a-z,有沒有比較快速的寫法或函數可以用?

    以上問題想要麻煩你一下,我是剛學不久的新手,真不好意思.

    回覆刪除
    回覆
    1. 1. 我沒在用 IDE 耶... 除了 Eric 以外只聽說過 Eclipse + PyDev

      2. array = [chr(ascii) for ascii in range(97, 123)]
      或是看看 string 這個 module
      http://docs.python.org/library/string.html

      刪除
    2. 謝謝!這個對我很有用^__^

      刪除
  5. 看完這一系列,獲益良多,非常感謝!

    回覆刪除