一直想做的事
最近我在用wxPython開發某些程式,隨著開發的過程中,難免需要一些直接的測試,改動程式碼來進行測式似乎不是很明智的選擇,即使Python是直譯式的語言,每改一次重新啟動整個程式也是一種浪費,而且狀態每次也會重置,於是我開始想,我是否可以寫一個像Half-Life那樣的一個console整合到我的GUI中,如此一來我就可以在開發時直接進行某些測試,對某些特定的模組操作,如此一來開發的效率可以提升,對於程式而言也會更好除錯,但是雖然寫一個console不是什麼太難的事,但也不是什麼太輕鬆的事,為了早點完成程式,於是我就沒有真的去做
直到某本書的出現 : wxPython in action
當有一天我訂的書: wxPython in action終於來了,這本書要1500元,實在是不便宜,但是我認為卻很值得,我在書中發現我以前一直都沒仔細去注意到的東西,PyCrust,在翻過這章節時我驚訝地發現,這不就是我想做的嗎? 一個控制臺,可以讓我操作、觀察、測試我的GUI,而且整合的方法超簡單,只要一行指令
python pywrap.py main.py
在wx.py的package下的pywarp.py會自動找到app並且將PyCrust整合進去,在我程式中執行的畫面就像這樣
在截圖中我利用pycrust將gui的背景換成了紅色,它不止是一款簡單的GUI,因為他是動態載入模組的name space,和一般IDE不同的是,他的自動完成是動態的,一般的IDE只抓得到靜態的成員,但是即然是動態載入又是在執行中,有什麼成員一清二楚,所以基本上自動完成功能感覺非常地強大,但相對的弱點是對於靜態的部份比較麻煩
它除了可以自動整合到現有的wxPython gui程式中,更可以把裡面各個元件分開來獨立使用
所以它可以幹麻?
對我來說,PyCrust將會是像神兵利器般好用的工具,像是開發遊戲之類需要大量的調校,一個console或是動態的機制是免不了的,而console提供了立即且互動式的環境,有了PyCrust,就等於有了現成的console可以使用,在遊戲的開發過程中,開發者可以利用這個console動態地改變各種參數來觀察反應等等,當然開發遊戲只是其中一個應用的例子,即使在一般的GUI中也會是很好用的工具
順帶一提
wxPython in action真的是難得一見的好書,有別於一般的書,它使用問句來當做標題,但是不會因為這樣而零散雜亂,相反的,你可以很正式地看完一次,也可以很快速地掃過一次,當你需要什麼東西時,那些問句可以幫助你很快地找到你需要的東西,豐富的截圖和圖解更讓人不用費心去猜想到底做出來會是什麼樣子,或是想像到底是如何運作,如果要學wxPython,我覺得這本書真的是非常值得推薦,做為工具書,這本也是必備的一本
pyCrust中間的console是pyShell, 是個wxStyledTextCtrl的類別, 可以嵌入wxpython成為一個現有的script console介面, 做tool類型的app很好用.
有一個pyShell下的問題, 例如下列程式碼:
“””
for i in range(10):
pass
print ‘end’
“””
執行結果為:
“””
File “”, line 3
print ‘end’
^
SyntaxError: invalid syntax
“””
pyShell它內建的parsing機制似乎不接受兩行以上的敘述, 這導致shell.runfile(filename)也會無法執行兩行以上的script. 解法為使用shell.run執行execfile.
shell.run(r”execfile(r’%s’)”%(filename), verbose=False)
我發現在pyShell的interprter中, 無法以thread的方式獨立出一個程序來實現GUI的response.
例如以下程式:
from time import sleep
def myloop(sleeptime):
for i in xrange(sleeptime):
sleep(1)
print ‘Hi’
>>> myloop(3)
Hi
Hi
Hi
>>>
執行時甚至連’Hi’都一次顯示, 而不是sleep(1)之後print ‘Hi’. 我的推測是pyShell的”self.more = self.interp.push(command)”佔據了VM, 它要把”command”都執行完畢才return.