python開發APP(二)用pythonCard增加開發效率

python開發APP(一) GUI 裡使用了wxPython來開發GUI介面,但很快便會發現 wxPython 的程式碼十分繁瑣而且缺乏好用的佈局工具,剛好 pythonCard 補足了這方面的一點缺陷。下載後安裝的方法很簡單,一樣是 python setup.py install 這個指令即可,但需要注意的是 pythonCard 是架構在wxPython之上,所以在安裝順序上得先確定已經安裝wxPython後再安裝pythonCard才不會發生錯誤。

pythonCard01.JPG
pythonCard01.JPG

安裝後就有方便的佈局工具可以用了,到python目錄下Lib\site-packages\PythonCard\tools\resourceEditor 執行 resourceEditor.py (也可以把這檔案做個捷徑方便使用)就會看到如左圖的畫面,左上角是佈局工作,右下角是佈局元件的屬性編輯工具,這樣的畫面是不是跟很多高級IDE工具很像,比wxPython實在是方便很多,對於開發效率更是提升不少。

 

pythonCard02.JPG
pythonCard02.JPG

除了工具以外,pythonCard也提供了大量方便的範例程式讓使用者方便參考使用,只要到python目錄下Lib\site-packages\PythonCard\samples 目錄下執行 samples.pyw 就可以看到像左邊畫面的工具,除了有原始檔案還可以試著直接執行關看結果。

接下來實做一下簡單例子,做一個讓文字框在點擊按鈕後可以顯示跟文字輸入框一樣的文字,大概拉出像以下的畫面並儲存成 PyCardTest.rsrc.py 即可,順便看看內容如何?

{'application':{'type':'Application',
'name':'Template',
'backgrounds': [
{'type':'Background',
'name':'bgTemplate',
'title':'Standard Template with File->Exit menu',
'size':(487, 162),
'style':['resizeable'],

'menubar': {'type':'MenuBar',
'menus': [
{'type':'Menu',
'name':'menuFile',
'label':'&File',
'items': [
{'type':'MenuItem',
'name':'menuFileExit',
'label':'E&xit',
'command':'exit',
},
]
},
]
},
'components': [

{'type':'TextField',
'name':'go',
'position':(10, 51),
'size':(417, -1),
},

{'type':'Button',
'name':'Button1',
'position':(353, 7),
'label':u'\u78ba\u5b9a',
},

{'type':'TextField',
'name':'Name',
'position':(60, 8),
'size':(273, -1),
'text':u'Input your Name',
},

{'type':'StaticText',
'name':'StaticText1',
'position':(10, 10),
'text':u'\u540d\u5b57',
},

] # end components
} # end background
] # end backgrounds
} }

pythonCard03.JPG
pythonCard03.JPG

PyCardTest.rsrc.py 程式碼相當簡單,看不看其實都沒啥咪差,但稍微瞭解一下內容架構也不算是壞事。


接下來就是如何應用它了,先建立一個同名擋案 PyCardTest.py 放在同目錄下,這個檔案就是我們要撰寫邏輯控制程式碼的地方,首先要導入GUI,所以會有固定的格式如下顯示。


 


from PythonCard import model

class MyBackground(model.Background):

def on_initialize(self, event):
pass

if __name__ == '__main__':
app = model.Application(MyBackground)
app.MainLoop()

接下來要幫按鈕加上功能,在上面的程式碼class裡加上一個是件綁定的方法。

    def on_Button1_mouseClick(self,event):
self.components.go.text = self.components.Name.text

儲存後試著執行PyCardTest.py就可以看到完整功能的應用程式了。


如果要給別人使用當然得封裝一下,那就使用一下py2exe來編譯,果然按照之前的方法馬上就出錯失敗,問題是出在元件沒有被一起封裝進來。得稍微修改一下py2setup.py內容



from distutils.core import setup
import py2exe

#setup(console=['PyCardTest.py'])

import os
# find pythoncard resources, to add ad 'data_files'
pycard_resources = []
for filename in os.listdir('.'):
if filename.find('.rsrc.') > -1:
pycard_resources += [filename]

# includes for py2exe
includes = []
for comp in ['button', 'image', 'staticbox', 'statictext',
'textarea', 'textfield', 'passwordfield']:
includes += ['PythonCard.components.' + comp]
print 'includes', includes

setup(
windows = [
{
"script": "PyCardTest.py",
}
],
options = {
"py2exe": {
"optimize": 2,
"compressed": 1,
"includes": includes,
}
},
)

如此就可以成功產生exe執行檔,再把PyCardTest.rsrc.py 複製到同目錄就依竊OK了。


[+/-] 繼續閱讀...

Ruby on Rails 開始在 Win7

正規的教學裡摸索Ruby實在有點累,甚至難以一窺全貌,Rails其實有點像是Django一樣的MVC框架,所以兩者也有其相似之處(使用上的邏輯思考)。看了很多如何開始的文章,對於Ruby的安裝上實在不是很適合我(喜歡免安裝、帶著走),所以決定從InstantRails下手,首先到官網去下載InstantRails,這樣就可以開始對Ruby開始動手動腳了。

這裡下載InstantRails-2.0-win.zip這個檔案來解壓縮(隨便你喜歡放在哪),從目錄架構來看,它是利用了Apache+PHP+MySQL的基礎,所以你可以執行InstantRails.exe 後看到Apache和MySQL便被啟動,如果點擊最上方左邊按鈕就可以進入Ruby的管理介面,如下圖。

ruby01.JPG
ruby01.JPG

既然使用的是AMP架構,也就是說你也可以單純把它當作一個Web Server來使用,在瀏覽器輸入http://127.0.0.1/ 就會看到網頁顯示出來,而這個網頁是放在www的子目錄下。

Ruby程式是放在ruby子目錄下,而rails_apps這個子目錄就是將來我們要開發的專案存放區,當你進入rails_apps子目錄後會看到底下子目錄名稱剛好跟左圖 Rails Applications一樣。

可以點擊Create New RailsApp…按鈕打開DOS視窗,輸入指令 rails <專案名稱>,再回到管理視窗點擊Refresh List按鈕就可以看到剛才建立的專案名稱,勾選起來後再點擊Start with Mongrel按鈕開始執行剛才的專案。用瀏覽器開啟 http://127.0.0.1:3000/ 後就會發現專案網頁啟動了。

ruby02.JPG
ruby02.JPG

而其中如果要改變port的設定就是到 Configure Startup Mode… 按鈕裡面去更改設定。

如果要手動來啟動專案則到剛才的DOS視窗進入專案名稱子目錄下輸入 ruby script/server 便可以啟動,啟動後跟Pyton一樣可以隨時修改程式碼卻不必再重新啟動而直接套用。

注意:啟動專案跟Apache是沒關係的,就算把Apache停止掉也不影響。

到此為止一個專案的基本架構已經完成,在專案目錄下可以看到一個 app 子目錄,底下有四個子目錄controllers、helpers、models、views就是MVC架構的分類,跟Django十分類似。

繼續為我們的專案添加功能,下指令 ruby script\generate controller MyTest01 就會像下圖一樣,幫你建立一些功能檔案。

ruby03.JPG
ruby03.JPG

 

 

到 app\views\my_test01 目錄下建立 index.html.erb 檔案,內容如下:

 

 

<html>
 <head>
   <title>Hello World 我的第一個頁面</title>
  </head>
<body>
  <h1>Hello World 我的第一個頁面</h1>
</body>
</html>

基本上這算是一個輸出網頁,但Ruby其實還不知道該如何輸出它,接下來到剛才產生的 app\controllers\my_test01_controller.rb 檔案做編輯修改:


class AppController < ApplicationController
def index

end
end

這裡 def index 定義了index的細部功能,然後套用views下的視圖,這樣在瀏覽器下輸入 http://127.0.0.1:3000/my_test01/indexhttp://127.0.0.1:3000/my_test01/ 都可以看到"Hello World 我的第一個頁面" 這一段文字了。


有了以上Ruby運行環境的基礎概念,接下來就可以開始測試學習更深入的語法了。

[+/-] 繼續閱讀...

Tomcat 在Win7下使用

首先得要有tomcat,到tomcat官網下載最新版,這裡下載的是tomcat 7 的64-bit Windows zip (pgp, md5),因為我的環境是Win7 64bit,JAVA 64bit,所以當然使用64bit tomcat的ZIP(免安裝)。

把壓縮檔解壓縮得到一個apache-tomcat-7.0.21目錄,暫時隨便你放在哪都行,免安裝就是要有強大的可攜性(除非必要不使用絕對路徑),再到目錄下的bin子目錄執行startup.bat,如果無法順利執行或告訴你找不到JAVA_HOME那就編輯 startup.bat 裡加上 set "JAVA_HOME=C:\Program Files\Java\jre6" 這一句指定JAVA的所在目錄(這就是不得已的絕對路徑),再一次執行 startup.bat 就會看到執行畫面。

tomcat_run.JPG
tomcat_run.JPG

Tomcat 目錄架構

  • bin          Tomcat程式相關指令
  • conf         Tomcat設定檔
  • lib           Tomcat  jar函式庫
  • logs         日誌檔
  • temp        存放暫存檔
  • webapps   網頁程式存放目錄
  • work         存放編譯好的Servlet

 

打開瀏覽器 http://127.0.0.1:8080 就可以看到網頁顯示,而顯示的內容來自 webapps\ROOT ,如果要看他自帶的的範例則在網址後加上 examples 就會看到 webapps\examples 的內容。

重點是要在網頁上管理tomcat就要輸入 http://127.0.0.1:8080/manager 結果是要你輸入帳號密碼,但不管輸入啥咪都沒用也沒任何提示,此時就要到 conf 子目錄下去編輯 tomcat-users.xml 擋案,在 <tomcat-users> 節點裡加上以下設定:

  <role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="admin" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status"/>

重新啟動tomcat後再一次進入管理介面,使用admin帳號就可以看到一切了。


tomcat_manager.jpg
tomcat_manager.jpg

[+/-] 繼續閱讀...

打造一個可攜GAE開發環境

在正常情況要開發GAE APP並不需要這麼麻煩,只要照著google的說明一步步安裝就能很輕鬆打造出一個GAE的開發環境。但事情如果都能如此單純就是最好不過的,但偏偏常會碰到系統已經安裝好python卻偏偏不是32位元或者2.5版,這樣在將來的開發過程就不難保證會碰上問題,而且如果要到其他電腦下繼續工作,難道還要在花一次精神與時間去佈署嗎?

為了應付以上問題以及讓開發環境單純,現在就開始來打造一個可攜環境吧,反正python以及GAE都不是標準的Windows程式所以在安裝過程並不會給你亂COPY檔案到你想都想不到的地方。

  • 找個乾淨的windows系統開始安裝python 2.5版以及GAE SDK(寫文章此時是1.5.3版)。
  • 如果害怕將來安裝完後會有一堆你看不懂的檔案留在你的系統裡,可以先安裝影子系統,然後打開虛擬環境再開始上面步驟。
  • 設一個目錄PortableGAE然後把Python25目錄及google_appengine目錄都移到PortableGAE目錄裡。
  • 到 \PortableGAE\google_appengine\launcher 下GoogleAppEngineLauncher.exe檔案按右鍵複製,再到 \PortableGAE 下去貼上捷徑,再去編修這個捷徑檔裡的絕對路徑都更改成相對路徑。
  • 接下來執行剛才建立的捷徑檔案。



  • 001
  • 點擊 Edit / Preferences 選項
     002
  • 再像圖片裡一樣填入路徑。

到此基本上已經完成我們所要的功能了。偏偏遇上了一些問題,所以順便記錄一下,一個是SSL問題,一個是easy_install工具。

python 2.6版以後已經有包含SSL模塊了,但2.5版卻沒有,所以如果用的是古老的GAE SDK並不會有任何錯誤,但現在的GAE SDK卻會告訴你有這個問題,反正缺啥裝啥,為了將來可能還要安裝其他模塊那就先安裝 python setuptools 好了(如果安裝時python路徑無法選擇,那就暫時把python25目錄移到原安裝目錄下再繼續)。安裝完後到 python25\Scripts 下就能找到 easy_install.exe了。

再來安裝PIL模塊。 easy_install PIL 很快就安裝完成。

用 easy_install SSL時卻發生錯誤,既然無法自動只好手動。

我們用MinGW32來編譯我們要的模塊,首先下載OpenSSL(選擇Developer)跟 libgw32c (選擇Developer)後解壓縮到MinGW32目錄下。

設定一下臨時路徑。

set PATH=%PATH%;C:\MinGW\bin
set LIBRARY_PATH=C:\MinGW\lib
set C_INCLUDE_PATH=C:\MinGW\include

下載 Python SSL模塊原始檔。http://pypi.python.org/pypi/ssl

解壓縮後修改setup.py檔

if sys.platform == 'win32′:

# Assume the openssl libraries from GnuWin32 are installed in the
# following location:
gnuwin32_dir = os.environ.get(“GNUWIN32_DIR”, r”C:\MinGW\GnuWin32″)

到此就可以下指令開始安裝了

python setup.py build -c mingw32 install

一切都完成後就可以把 PortableGAE整個目錄帶著跑了。


[+/-] 繼續閱讀...

Win7下解決Wacom繪圖板反應延遲

到 控制台 / 手寫筆與觸控 / 手寫筆選項 ---> 按住不放 / 設定 ---> 取消 啟用滑鼠右鍵按住不放。

再到 控制台 / 手寫筆與觸控 / 筆觸 ---> 取消 使用筆觸快速且輕鬆地執行一般動作。

如此即可解決反應延遲問題。

[+/-] 繼續閱讀...

安裝node.js

因為我在Windows下去進行安裝,所以我先打開了MINGW32,因為我在官網下載了for win的node.exe下來執行並不順利。

wget http://nodejs.org/dist/v0.5.3/node-v0.5.3.tar.gz

tar xzvf node-v0.5.3.tar.gz

cd node-v0.1.15

然後在下達 ./configure --prefix=/var/iapps/nodejs 時發生了找不到OpenSSL的錯誤,所以加上了 --without-ssl 參數。還有必須讓環竟擁有執行python的能力。

./configure --prefix=/var/iapps/nodejs –without-ssl

make && make install

程式跑了一陣子後就會把編譯好的node放到 /var/iapps/nodejs下,所以將來你的程式第一行都得加上 #!/var/iapps/nodejs/bin/node 以告知程式要去哪執行。接著測試一下官網的程式 Hello World。哈哈,OK成功了。

[+/-] 繼續閱讀...

準備換網路公司了

網路流量記錄
網路流量記錄

現在使用的是Cable Modem,但在2年前該公司利用了老客戶對該公司的信任而欺騙了我這個老客戶,2年前接到群X的電話告知該公司對老客戶提供了升速減價方案但得簽2年約且季繳,反正ADSL那麼貴,基本上我使用的時段又與別人不太一樣碰不上特殊塞網時段,但高興不到一個月就發現他們推出針對新用戶是一樣的價格卻只要綁約一年(也沒要求季繳),新申裝又能抽獎又能拿禮卷,這算啥咪老客戶優惠?想想算了,反正ADSL還是很貴而沒其他替代品就不計較了。

對於該公司使用了快10年,看著他成長服務品質持續改善(當然價格也不斷調漲),我決定在轉換ISP前給予他們一次機會也為自己詢問一下這次是否有老客戶優惠,結果十分失望再加上最近斷線率高的驚人還都是無預警也讓我十分火大。

業者回覆
業者回覆

從回函判斷我想他們完全不想理老客戶,對我提出的問題完全沒有正面回應,讓人感覺反正是煮熟的鴨子還怕飛了不成,既然如此我也算仁至義盡了。

剛好最近NCC要求某電信業者做出降價也讓兩者的降格拉近了,所以就來檢討一下自己的網路使用量。

可以歸納出以下條件:

  • 現在大部分服務及自己的網站已經放到網路上。
  • ADSL(3M/384K)與光世代(4M/768K)兩者與之前Cable(8M/640K)在價格與需求上最相近。
  • 上傳頻寬比下傳重要。
  • 更換ISP後聯國外頻寬可以獲得提升,所以Cable的8M連出國常無法達到真正8M。
  • 分析自己使用的習慣跟流量記錄,更換光世代(4M/768)是最划算。

也許有人要問50M/5M的CP值不是最高嗎?的確沒錯,但只要是用不到就是浪費,而且從別人那接收了一台ASUS 500gD經過改造後幫他加上硬碟,完成一台多功能的Linux Server(流量記錄就靠他),靠著自己拼湊出來的一些自動化程式讓上傳跟下載的工作都可以關機後讓他接續。這就是我為何喜歡開放式系統的原因,只要了解一點程式就可以調整到完全符合自己需求。

[+/-] 繼續閱讀...

Blogger自訂icon

打開http://draft.blogger.com後登入你的blogger後,切換到 設計/網頁元素 就會看到左上角多了一個 Favicon / Edit 進去後選擇自己的圖示。

有時因為板面的關係還是看不到效果,請到 設計/HTML編輯 去</head>之前加上兩行:

   1: <link href='http://www.URL.com/favicon.ico' rel='shortcut icon'/>
   2: <link href='http://www.URL.com/favicon.ico' rel='icon'/>

www.URL.com 就是你的blogger網址

[+/-] 繼續閱讀...

利用pyquery抓資料

有些網站的資料並不是很直接可以抓取到,尤其是每次網頁資料屬於需要即時更新,那網站的設計者常會加上一個 timemap 好處理cache的問題,那原本要取得的資料網址就可能變成一串又長又臭的亂碼,如此一來要從固定網址去追蹤動態網址舊常常會是不斷的解析。還好python裡有個好用的模組pyquery它的使用方法就跟jquery一樣方便。

首先抓取主頁取得動態網址,得先點選後才能跳入資料頁:


from pyquery import PyQuery as pq
import urllib2,sys,os

d = pq(url='https://www.jpmrich.com.tw/wps/portal')
p = d("a#fundmorelink")

word = 'https://www.jpmrich.com.tw' + p.attr("href")

很輕鬆的就抓到他的路徑網址,並將其放到word裡,而這個路徑裡正是我們需要的資料,如圖:


資料網頁
資料網頁

那就繼續用pyquery來抓取每個基金的淨值。

d = pq(url=word)
s = ""
p = d("tr.table_level_4, tr.table_level_5")

s = p.text().split(' ')

FILE = codecs.open('jpm03.html','w','utf-8')
for i in range(len(s)):
if i%16 == 0:
FILE.write(s[i] + ',' + s[i+1] + '\n')
FILE.close()
結果如下圖,再來就隨便你是否要存資料庫或要做啥囉。

基金淨值
基金淨值

[+/-] 繼續閱讀...

python UnicodeError

UnicodeError: ASCII decoding error: ordinal not in range(128)' and 'UnicodeError: ASCII encoding error: ordinal not in range(128)

執行時出現以上錯誤就表視編碼上出現錯誤,解決方法:

value = unicode(value, "utf-8")

完整一點:



   1: try:
   2:     unicode(value, "ascii")
   3: except UnicodeError:
   4:     value = unicode(value, "utf-8")
   5: else:
   6:     # value was valid ASCII data
   7:     pass

但有時卻不知道網站或文件編碼,則可以安裝 chardet 套件:

>>> import chardet
>>> import urllib
>>> urlread = lambda url: urllib.urlopen(url).read()
>>> chardet.detect(urlread("http://www.google.com"))
{'confidence': 0.99, 'encoding': 'utf-8'}
>>>

如果是在檔案寫入時發生的錯誤:


FILE = open('jpm03.html','w') 預設是ascii所以得改成


import codecs


FILE = codecs.open('jpm03.html','w','utf-8')  即可。

[+/-] 繼續閱讀...

HTML5標籤向下相容解決

HTML中一個方便的特性就是可以省去一大堆的DIV標籤,直接以有意義的文字去設定標籤區塊,如下:

   1: <!DOCTYPE html>
   2: <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   3:  
   4: <html>
   5:     <head>
   6:         <title><!-- Your Title --></title>
   7:     </head>
   8:  
   9:     <body>
  10:         <header>
  11:             <!-- ... -->
  12:         </header>
  13:  
  14:         <nav>
  15:             <!-- ... -->
  16:         </nav>
  17:  
  18:         <div id="main">
  19:             <!-- ... -->
  20:         </div>
  21:  
  22:         <footer>
  23:             <!-- ... -->
  24:         </footer>
  25:     </body>
  26: </html>

但問題是,那舊的瀏覽器不支援怎麼辦,例如IE,那就幫它設個條件



   1: <!--[if IE]>
   2:     <script src="html5.js"></script>
   3: <![endif]-->

那這個js檔裡應該填入像以下的的程式碼,就可以讓舊流覽器也能正常顯示囉。



   1: document.createElement("article");
   2: document.createElement("footer");
   3: document.createElement("header");
   4: document.createElement("hgroup");
   5: document.createElement("nav");

[+/-] 繼續閱讀...

WLW發佈到blogger發生POST拒絕回應

找尋原因很可能是因為blogger被Chrome開啟後的問題,造成當天無法使用WLW發佈文章,甚至編輯blogger設定讓WLW重新讀取設定也無法取回blogger樣式。

可能的解決方法:

  • 光關閉Chrome的blogger分頁確定無效,若session存於client可能得完全關閉Chrome。
  • 若session存於server,則必須等一陣子後才能恢復。

因為當天無法即時找到解決方法,所以隔天在開WLW後才正常,故無法判定以上兩點,當然也有可能是blogger server的問題。

[+/-] 繼續閱讀...

解決Chrome不支援本地ajax問題

11062404.JPG
11062404.JPG

基本上Chrome有個小小的問題,就是一般如果使用AJAX來做資料交換因為是基於javascript則不管是不是放在http主機上或是單獨的html檔都能夠將資料顯示出來,至少FireFox或IE都可以。

所以以jQuery做一個資料異步傳輸的範例,在FF或IE上都正常,偏偏在Chrome下就看不到資料。

 



這個問題可能是因為Chrome考量未來在WEB APP的安全性所致(我猜的)。但既然大概知道Google的想法,所以就要用新的方法去做而不是受限於以往的習慣,否則再好用的工具也會被習慣(也許是因為之前不好用而不得不為之的方法)所淘汰。

研究了Chrome裡APP的邏輯發現其實Chrome已經把http主機放在核心裡,而不是單純解析javascript而已,所以它的交互方式根本跟在http主機上差不多,所以問題就解決了。

11062401.JPG
11062401.JPG
11062402.JPG
11062402.JPG

首先打開 工具/擴充功能 下的開發人員模式,選擇到你所開發的html檔案的那個目錄,結果啥都沒有是正常的。因為缺了一個檔案,叫 manifest.json 內容如下:

   1: {
   2:   "name": "專案名稱", "version": "1",
   3:   "icons": {"128": "128.png", "24": "24.png"},
   4:   "permissions": [ "notifications" ],
   5:   "app": {"launch": {"local_path": "datagrid.html"}}
   6: }

這個檔案類似一個設定檔,只要把它跟你的html檔放在一起就可以。Google的開發模式裡不好地方都有類似概念,像GAE的yaml或Android…….,這時後再載入一次就可以再擴充功能裡顯示了,如果將來html檔有修改就得"重新載入",這是個缺點也是優點,缺點是有點麻煩,優點是程式可以帶著走了。


然後開啟新的分頁就會看到你APP的頭像,給他執行下去,資料全出來了。


11062403.JPG
11062403.JPG

[+/-] 繼續閱讀...

尋找dropbox資料庫目錄


import ctypes, base64, pickle, sqlite3, os

is_windows = True
try:
# try to get Windows path first
SHGetFolderPath = ctypes.windll.shell32.SHGetFolderPathW
except AttributeError:
is_windows = False

if is_windows:
from ctypes.wintypes import HWND, HANDLE, DWORD, LPCWSTR, MAX_PATH
SHGetFolderPath.argtypes = [HWND, ctypes.c_int, HANDLE, DWORD, LPCWSTR]
path_buffer = ctypes.wintypes.create_unicode_buffer(MAX_PATH)
# 26 is CSIDL_APPDATA, the code for retrieving the user's Application Data folder
SHGetFolderPath(0, 26, 0, 0, path_buffer)
dropbox_db_path = path_buffer.value + '\Dropbox\config.sqlite'
else:
dropbox_db_path = os.path.expanduser('~/.dropbox/dropbox.db')

print dropbox_db_path

[+/-] 繼續閱讀...

python IDLE

 

熱鍵 中文說明 英文說明
alt + / 自動完成單詞(可重複循循) Expand Word
ctrl + → 或 ← 游標移到下一個/前一個單字  
ctrl + ↑ 或 ↓ 算是快速移動吧XD  
ctrl + ] 縮排 Indent Region
ctrl + [ 取消縮排 Dedent Region
alt + 3 注解 Comment Out Region
alt + 4 取消注解 Unconmment Region
ctrl + space 顯示自動完成(註1) Show Completions
alt + m 開啟選取(反白)的Module Open Module
alt + p 前一個指令 Previous Command
alt + n 下一個指令 Next Command
alt + c 瀏覽目前unit下面的class Class Browser
ctrl + F6 重新啟動shell Restart Shell
tab 平常是indent,前面有字時為自動完成,連按兩下可把自動完成的字貼上。  

[+/-] 繼續閱讀...

python開發win app流程



[+/-] 繼續閱讀...

python開發APP(一) GUI




Python的GUI庫很多,在這裡選用的是wxPython,安裝後在Windows下就有以下的工具跟教學範例,其中XRC Resource Editor就是要用來設計GUI的圖型化工具。

打開後如以下一般。設計好之後可以存成XRC檔或直接生成 .py 檔案,現在要使用XRC檔來做連結,將來也方便修改語系問題。

resource1.xrc檔
   1: <?xml version="1.0" ?>
   2: <resource>
   3:  <object class="wxFrame" name="FRAME1">
   4:     <title>測試窗口</title> 
   5:     <icon>favicon.ico</icon>
   6:   <object class="wxPanel" name="MyPanel">
   7:    <object class="wxButton" name="CloseButton">
   8:     <label>關閉</label>
   9:     <pos>15,10</pos>
  10:    </object>
  11:   </object>
  12:  </object>
  13: </resource>
test2.py檔
import wx
import wx.xrc as xrc


class MyApp(wx.App):
    def OnInit(self):

        self.res = xrc.XmlResource(r"./resource1.xrc")       
        self.frame_1 = self.res.LoadFrame(None, "FRAME1")                
        self.Bind(wx.EVT_BUTTON, self.OnClose,  id=xrc.XRCID('CloseButton'))        
        self.frame_1.Show()
        return 1
    # End of OnInit(). 
    
    def OnClose(self, event):
        self.frame_1.Close()    
# End of class MyApp.

if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()
執行結果

[+/-] 繼續閱讀...

讓blogger圖片自動燈箱顯示

首先隨便你喜歡哪一套燈箱程式都可以,然後也得讓你的blogger支援 jQuery ,這兩部份資料很多所以省略。

但燈箱範例裡都會要使用者在圖片裡加上 <a class=”lightbox”… 或者 <div id=”gallery”…. 類似的動作,但誰那麼勤勞每次都手動加上勒,所以我就幫他加上一段 jQuery 程式

   1: $(function() {
   2: $('div[id^="post-body-"] a').each(function(){
   3:     if (($(this).attr("href").toUpperCase().indexOf(".JPG")!== -1) || ($(this).attr("href").toUpperCase().indexOf(".PNG")!== -1))
   4:        $(this).lightBox();
   5: });
   6: });

這樣一來管你是JPG或PNG檔,連大小寫都不管,只要貼上全都套上燈箱。

[+/-] 繼續閱讀...

plugin測試

import os
for root, dirs, files in os.walk('.'):
    for file in files:
        if file.endswith('.ui'):
            os.system('pyuic4 -o ui_%s.py %s' % (file.rsplit('.', 1)[0], file))
        elif file.endswith('.qrc'):
         os.system('pyrcc4 -o %s_rc.py %s' % (file.rsplit('.', 1)[0], file))
以上用SyntaxHighlighter for Windows Live Writer 
以下用 Code Snippet


   1: import ctypes, base64, pickle, sqlite3, os 
   2:  
   3: is_windows = True
   4: try:
   5:   # try to get Windows path first
   6:   SHGetFolderPath = ctypes.windll.shell32.SHGetFolderPathW
   7: except AttributeError:
   8:   is_windows = False
   9:   
  10: if is_windows:
  11:   from ctypes.wintypes import HWND, HANDLE, DWORD, LPCWSTR, MAX_PATH
  12:   SHGetFolderPath.argtypes = [HWND, ctypes.c_int, HANDLE, DWORD, LPCWSTR]
  13:   path_buffer = ctypes.wintypes.create_unicode_buffer(MAX_PATH)
  14:   # 26 is CSIDL_APPDATA, the code for retrieving the user's Application Data folder
  15:   SHGetFolderPath(0, 26, 0, 0, path_buffer)
  16:   dropbox_db_path = path_buffer.value + '\Dropbox\config.sqlite'
  17: else:
  18:   dropbox_db_path = os.path.expanduser('~/.dropbox/dropbox.db')
  19:  
  20: db = sqlite3.connect(dropbox_db_path)
  21: cur = db.cursor()
  22: cur.execute('select key, value from config order by key')
  23: for row in cur:
  24:         print row[0], '=', pickle.loads(base64.b64decode(row[1])) if row[1] != None else row[1]
  25: db.close()

測試結果完整呈現於此

[+/-] 繼續閱讀...