Saturday, August 02, 2008

PyGtk and Py2exe

0 意見



Eco Manager是用python + pygtk寫的,當然這個管理程式希望能包成exe。因此就想到py2exe,自已有try了很久,但是怎麼包都失敗。後來學弟有找到方法,只要把Gtk這資料夾裡的etc、lib、share三個資料夾copy放到py2exe的build出來的dict資料夾中就可以work了。... Read more.

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
Friday, August 01, 2008

Python subprocess

0 意見

DataGrabber是之前參加es2008的作品,裡面的Sensor是Eco,host端目前使用window + python。主要内容是用來操控window圖型介面,其中會用到開啟資料夾的指令。

subprocess.Popen('explorer /n,'+filepath)


... Read more.

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
Thursday, July 31, 2008

PyGtk ProgressBar

0 意見

在upload、dump、erase binary file到Eco上,我們會想知道現在進行的進度。PyGtk中有一個ProgressBar可以拿來使用,Upload的時候,會知道現在透過rs232已經送出了多少bytes,並且也知道整個要上傳binary file的總bytes。

class ProgressBar:
    def __init__(self,gladefile,bar_name):
        self.gladefile = gladefile
        self.dialogboxname = "progressbar_dialog1"
        self.bar_name = bar_name

    def run(self):
        self.wTree = gtk.glade.XML(self.gladefile,self.dialogboxname)
        self.progressbar = self.wTree.get_widget(self.dialogboxname)
        self.bar = self.wTree.get_widget("progressbar1")
        self.bar.set_text(self.bar_name)

    def close(self):
        self.progressbar.destroy()


    def set_fraction(self,val):
        if val <= 1.0 and val >= 0.0:
            self.bar.set_fraction(val)
        else:
            self.bar.set_fraction(1.0)
        #http://faq.pygtk.org/index.py?req=show&file=faq23.020.htp
        while gtk.events_pending():
            gtk.main_iteration()


因此create出來的bar object,只要使用set_fraction傳入目前已完成百分比。
... Read more.

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
Wednesday, July 30, 2008

Python Pyserial scan serial prot

0 意見

之前替Lab寫了一個Python + PyGtk的GUI程式,目的是為了Lab的Sensor Eco要賣,所以要提供一個簡單的GUI環境,讓使用者能夠從Lab Server下載包好的binary file,並且對Eco的EEPROM做dump、erase、upload、verify等動作。Eco connection是透過RS232,因為usb driver還沒寫好0rz,目前先用RS232將就一下。下面是python套件pyserial掃windows and linux serial port我的寫法。

def scan_serialprot():
    available = []
    for i in range(256):
        try:
            if os.name == "nt":
                s = serial.Serial(i)
                available.append((i,s.portstr))
                s.close()
            elif os.name == "posix":
                ser_name = '/dev/ttyUSB' + str(i)
                s = serial.Serial(ser_name)
                available.append((i,s.portstr))
                s.close()
            else:
                pass
        except serial.SerialException:
            pass
    return available

linux那邊是因為我們用的是usb轉rs232的chip,所以我們要用/dev/ttyUSB之類的device name去scan。... Read more.

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
Tuesday, July 29, 2008

How to use Subversion

0 意見

如果os是linux base的話。只有一些instruction要背。

$svn import
$svn list
$svn checkout
$svn commit
$svn update
$svn add
$svn rm


首先自已寫的project如果想要上傳到svn自已的repository中的話,要先用svn import這個指令把project import到svn自已的repository中。假設repository是waynec,local端project資料夾是GATE_0803,指令為:

$svn import GATE_0803 svn://url/svnroot/waynec/GATE_0803

如果想要知道是否成功,可以用svn list這個指令。

$svn list svn://url/svnroot/waynec

接下來,要做的事情是取得svn server上project的working copy,working copy是一份從資料庫裡check out出來的檔案,這份檔案除了含有原本的內容之外,svn會另外增加.svn資料夾,裡面存放著每個檔案的版本資訊等資料,所以我們要有working copy才能夠跟資料庫做同步的動作。

$svn checkout svn://url/svnroot/waynec/GATE_0803

以上指令就會把svn server的project GATE_0803,copy一份到自已電腦上並且與svn server做同步。如果用ls -a指令看的話,會發現GATE_0803下面的每一個資料夾,都多了一個.svn的資料夾,這是svn加上去做控制的資訊。

之後在此資料夾下做某些檔案的修改之後想要到一個段落,可以用svn commit去更新server的project。

$svn commit

如果project很多人一起修改,在進行編輯前,先使用svn update指令去確定目前自已project資料夾與server上是一樣版本。

$svn update

因為svn會透過.svn這個資料夾來紀錄檔案的版本資訊,因此任何不在.svn裡面有紀錄的檔案,svn都無法進行版本控制,所以,當我們新增一個不在repository裡面的檔案的時候,我們必須要用svn add來把把資訊放到.svn裡面。

$svn add C.txt

這樣之後才能使用svn commit去更新svn server也新增此檔案。一樣如果要刪除某檔案,也要先通知自已資料夾的.svn。之後再svn commit通知server也刪除此檔案。

$svn rm C.txt

另外,如果只是想copy一份project下來,並不想與svn server做同步,可以用svn export。

$svn export svn://url/svnroot/waynec/GATE_0803
... Read more.

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
Monday, July 28, 2008

Subversion Introduction

0 意見

最近Lab學長要畢業,我要接管Lab Server。第一個任務就是svn管理,除了開新帳號之外,還要教學弟他們怎麼使用。

開帳號部分,首先開repository,svn上repository就是存放project的地方。Lab的習慣是毎個人的ID是一個repository,毎個人負責的project、demo相關資料或論文都可放上去。
要建立一個repository,我們可以使用svnadmin create這個指令

$svnadmin create /svnroot/id

之後切換到/home/svnroot/id/conf的資料夾下,設定passwd的使用者id and passwd。

[users]
test = test

並且修改svnserve.conf,把三行註解拿掉。

[general]
anon-access = read
auth-access = write
password-db = passwd

此id的使用者就能用設定的帳密去使用。
... Read more.

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
Sunday, July 27, 2008

Code Syntax HightLight

0 意見

今天找了一下有關在Blogger上顯示Code Hightligt的方法。
Syntax-highlight
這個網站提供的,可以滿足大部份的程式語言。但是如果選擇顯示line number,post之後如果想要copy,格式在文字編輯器上會亂掉。
... Read more.

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
Friday, July 25, 2008

Linux Pthread Programming

0 意見

在Linux上program要使用到Pthread其實很平常,Socket的相關程式大都會用到。以下是部分程式碼

void *NM_TCP(void *threadarg)
{

    unsigned char *strAddr;
    unsigned int *tcpPort;
    struct thread_data *data;
    data = (struct thread_data *)threadarg;

    strAddr = data->addr;
    tcpPort = data->port;

}

void main()
{
    //parameter for pthread
    struct thread_data{
    U8_T *opcode;
    U8_T *addr;
    U16_T *port;
    };

    struct thread_data trd_data;

    trd_data.addr = inet_ntoa(UDPClntAddr.sin_addr);
    trd_data.opcode = &(SearchPacket.Opcode);
    trd_data.port = &(SearchPacket.TcpPort);

    pthread_create(&nm_threads[thread_idx],NULL,NM_TCP,(void *)&trdData);
}

Reference
https://computing.llnl.gov/tutorials/pthreads/

... Read more.

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
Wednesday, July 23, 2008

Python Pygtk and Glade Event handle

0 意見

使用Glade layout出想要的GUI介面之後,要處理的就是一些Button,像是Toolbar Button、Radio Button等的事件觸發。如下圖顯示,我們可以在Glade Singal Tab裡面,選擇GtkToolButton的Clicked Singal,然後填入自己想定義的Function Name。

之後在Python銜接的地方如下:

  1.     def __init__(self):
  2.         #Set Glade File
  3.         self.gladefile = "EPLab_Manager.glade"
  4.  
  5.         #window Title Name
  6.         self.windowname = "EPL Manager"
  7.         self.Win = gtk.glade.XML(self.gladefile,self.windowname)
  8.  
  9.         #Create dictionary and connect to event handle function
  10.         dic = {\
  11.             "on_manager_destroy" : \
  12.             self.manager_quit,
  13.             "on_tb2_version_clicked" : \
  14.             self.on_toolbar_version_clicked
  15.         }
  16.  
  17.         self.Win.signal_autoconnect(dic)
  18.  
  19.  
  20.     def on_toolbar_version_clicked(self,widget):
  21.         print 'on_toolbar_version_clicked\n'
  22.      

如此就能連接GUI的設定與Event Handler,當使用者按下設定好的Toolbar Button,便會trigger on_toolbar_version_clicked這個function運作。但是不知道哪理出問題,如果想要使用GUI上面close按鈕來關閉視窗,一定要用gtk.main_quit()來離開整個程式。因此上述程式的on_manager_destroy就是連接整個GUI GtkObjec的destroy singal。另外,想要不使用Glade的方式來連接,也可以透過程式直接connect。
  1.     self.Win.single_connect("destray",gtk.main_quit)

這種方式也可以。... Read more.

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
Thursday, July 17, 2008

Python pygtk and Glade

0 意見

會碰pygtk其實是因為Lab最近要趕出一個Project,並且對外發售的套件老師希望能夠open source,當初是想要用C#撰寫,不過老師特別偏愛Python,配上其他的GUI的話,當然首推GTK,只要runtime environment灌好就可以在任何平臺趴趴走。

首先到Pygtk下載套件,套件有三個Python、GTK environment、Pygtk三個。

安裝完之後新增test.py並import的地方可以這樣寫

  1. try:
  2.     import pygtk
  3.     pygtk.require("2.0")
  4. except:
  5.     print 'error import pygtk'
  6. try:
  7.     import gtk
  8.     import gtk.glade
  9. except:
  10.     print "You need to install pyGTK or GTKv2 ",
  11.     print "or set your PYTHONPATH correctly."
  12.     sys.exit(1)


Glade3是一個GTK的interface Designer,拖拉出來的檔案其實是xaml file、而且可以新增event handler,既然有現成的工具,除非是要動態新增或修改的,不然拖一拖就有個簡單的介面,其實非常方便。

在Glade拉出一個介面之後,Python這邊就要來把.glade的file吃進來。
  1. self.gladefile = "EPLab_Manager.glade"
  2. #window Title Name
  3. self.windowname = "EPLab Manager"
  4. self.wTree = gtk.glade.XML(self.gladefile,self.windowname)

如此就把整個glade file放入wTree當中,之後想要使用或是修改某個component,只要透過
  1. self.webview = self.wTree.get_widget("treeview1")

來get GTK裡面treeview component,之後就可以透過
pyGTK tutorial
PyGTK 2.0 Reference Manual
來查詢有哪些method或是property可以拿來使用。

... Read more.

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo