顯示具有 Python 標籤的文章。 顯示所有文章
顯示具有 Python 標籤的文章。 顯示所有文章

2019/01/07

Python 的 kbhit() 和 getch()

開發靠鍵盤控制的程式時,通常會需要以下兩個功能:
  • kbhit() 偵測是否有按鍵
  • getch() 讀取按鍵
因為要跨平台,所以決定用 Python 來開發,這時才發現上述兩個功能並沒有很標準的解法。再加上除了一般按鍵,還要支援功能鍵、方向鍵等特殊按鍵,讓這件事更加麻煩。折騰很久才找到既簡單又漂亮的解法,getkey。

getkey 直接用 pip 安裝即可:
pip install getkey
使用範例如下:
#!/usr/bin/env python3

from getkey import getkey, keys

while True:
    k = getkey(blocking=False)
    if len(k) > 0:
        if len(k) == 1:
            if keys.name(k) == "ESC":
                break
            print(k)
        else:
            print(keys.name(k))
簡單說明如下:
  • blocking=False 代表不管有沒有按鍵 getkey() 都會馬上返回,從返回值就可以判斷是否有按鍵
  • 若是一般按鍵,如 '0'~'9'、'A'~'Z' 等,返回值長度是 1,可以直接拿來用
  • 若是功能鍵、方向鍵等,返回值長度大於 1,建議用 keys.name() 來翻譯
這個解法的好處在於將平台的差異完全隱藏,可以支援 Windows、Unix/Linux、MacOS,甚至 Cygwin 等等,也可以正確解出功能鍵和方向鍵等。

有缺點嗎?有。原作者似乎不再更新和修正,在 Windows 上的 Python 3.x 安裝和使用會有一些問題,請參考原作者原專案的待解問題清單:
https://github.com/kcsaff/getkey/issues
所幸,有善心人士提供 修正版,但須下載原始碼來安裝:
git clone https://github.com/li-rupert/getkey.git
不會 git 的人,可以下載以下檔案解開:
https://github.com/li-rupert/getkey/archive/master.zip
安裝指令如下:
python setup.py install

2011/10/17

用 Python 來控制 Skype

終於找到一個可以利用 script 來控制 Skype 狀態的方法,先簡單留下參考資料:
利用 Skype for Linux 2.2.0.35 測試,確實可以改變 Skype 的狀態,但似乎還不夠穩,偶而會失敗。

2011/04/02

手動修改 Python Egg 的克難方法

Trac 是相當好用的專案管理系統,非常值得推薦。不過,畢竟是免費的 open source project,有時候遇到問題必須自己想辦法克服。 聽起來有點可怕?放心啦,以下的案例是我使用 Trac 五年多來第一次必須自己想辦法解決。

簡單說,有一個我很常用的功能在升級到 Trac 0.12.2 之後,變得不能用了。本著 open source 的精神,我找到問題的所在,也大約知道應該如何修正。然後,我就到該 project 的 ticket system 回報問題的症狀和可能解法。結果,兩個月過去了,這個回報如石沉大海... (也許我沒仔細遵循他們的回報規範吧?)

雖然我知道如何解這問題,但 Trac 包裝成 Python egg,我不知道如何去修正裡面的程式。後來發現 egg 其實是 .zip 的壓縮檔,用 unzip 便可解開:
mkdir trac-egg
cd trac-egg
unzip ../Trac-0.12.2-py2.5.egg
很容易就可以在解開後的檔案內找到並修正問題點。然後,應該就是用 zip 再打包回去吧?
zip -r -9 ../Trac-0.12.2-py2.5.egg *
檔案大小的差異讓我有點遲疑,但還是將這個修正後的 egg 取代舊的:
cp ../Trac-0.12.2-py2.5.egg /usr/lib/python2.5/site-packages/Trac-0.12.2-py2.5.egg
初步以 trac-admin 來測試 OK,但從 Web 去存取就有錯了。錯誤訊息大約是無法解開 egg 檔,所以用 zip 打包的方法應該有錯。偏偏網路上又找不到如何包裝 Python egg 的方法 (我承認,第一眼看起來有點複雜的資料,我就放棄不看)。

就在我想放棄的時候,發現 zip 有一個參數可以只更新修改過的檔案:
zip -f ../Trac-0.12.2-py2.5.egg
這個指令只換掉我剛剛修改過的檔案,而克難修正後的 egg 檔果然能夠動作。

2008/03/15

在 EeePC 上使用 wxPython

最近在學 wxWidgets。有時只帶 EeePC 出門,又想做點練習... 總不能把整套 GCC 灌到 EeePC 上吧?所以想到利用 EeePC 已內建的 Python。

Python 不能直接使用 wxWidgets,還需要安裝 wxPython 才行。Asus 並沒有提供 wxPython 套件,只好跟 Ubuntu 借。方法如下:
  • 在 /etc/apt/sources.list 新增以下這一行 (或其他 Ubuntu mirror):
    • deb http://free.nchc.org.tw/ubuntu dapper main universe

  • 然後到 console 執行以下指令:
    • sudo apt-get update
    • sudo apt-get install python-wxgtk
這個動作會安裝以下三個套件:
  • libwxgtk2.6-0 (2.6.1.2ubuntu2)
  • python-wxversion (2.6.1.2ubuntu2)
  • python-wxgtk2.6 (2.6.1.2ubuntu2)
安裝完畢,可以用以下範例來試試:
  • http://www.wxpython.org/test7.py.html
以下是一篇很簡短的中文教材:
  • http://yenjinc.info/?p=46
PS:可能不是專為 EeePC 建立的套件,程式結束之後有一些錯誤訊息:
(python:4924): GLib-GObject-WARNING **: instance of invalid non-instantiatable type `(null)'

(python:4924): GLib-GObject-CRITICAL **: g_signal_handlers_disconnect_matched: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed

(python:4924): GLib-GObject-WARNING **: instance of invalid non-instantiatable type `(null)'

(python:4924): GLib-GObject-CRITICAL **: g_signal_handlers_disconnect_matched: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed

還不知道怎麼解決這現象。不過,將就用用還可以...