2008年9月6日 星期六

[Python]透過DBUS調整螢幕亮度

今天研究了一下Screenlets的BrightnessScreenlet.py這支程式
發現到他調整螢幕亮度的方式是由DBus來控制的
在這邊把主要重點的部份寫出來

#載入DBUS
import dbus

#設定Bus
bus = dbus.Bus(dbus.Bus.TYPE_SESSION)
hal_object = bus.get_object('org.freedesktop.PowerManagement','/org/freedesktop/PowerManagement/Backlight')

#設置interface
hal_interface = dbus.Interface(hal_object,'org.freedesktop.PowerManagement.Backlight')

#由這dbus的interface去設定亮度(0~100)
hal_interface.SetBrightness(brightness)

[C/C++]滑鼠手勢...

今天一進公司就看到Steven和Jacky在討論東西...
在我才剛按下開機鍵準備坐上我的座位時
就聽見Steven說...”這就交給kie做吧! 反正他這麼閒“ .....(= =ll)雖然真的很閒也不用這麼大聲的講出來吧!

好啦...切入重點...他們在討論的就是一個簡單的滑鼠手勢的程式的演算法
其實真的是非常的簡單...Coding的部份也不過幾行而已...
重點是他們都把演算法都討論的差不多了...於是希望我實做出來..
好吧...於是就有了這一篇文章啦.....
這個程式呢...基本上應該算是一個Funtion
所以呢...我就不把全部的程式貼出來了
做法是
先按下左鍵取得起點...接著比對每一點座標
當位移量超過誤差的範圍就記錄為一個動作
並記下完成的點的位置
當比對和上次的動作相同時就不記錄
當放開左鍵時動作結束

以下為重點的Source Code

首先我在主程式加入了4個全域變數

Direction ..存上一次得到的方向
X.........記錄起始點的X座標
Y.........記錄起始點的Y座標
Range.....容許手殘畫歪的範圍

接著就是在程式中加入了3個事件

MouseDown...當然就是滑鼠按下的事件...這是為了取得開始的位置...你總要知道什麼時候開始畫手勢嘛
MouseMotion..滑鼠移動的事件.......都說是滑鼠手勢了...當然就是滑鼠動的時候要有記錄丫
MouseLeft.....滑鼠放開的事件......有始有終囉


然後...有coding的部份當然除了給初始值外就是這3個事件囉
以下為三個事件的Souse Code ... 有興趣就看看吧..

/*!
* wxEVT_LEFT_DOWN event handler for ID_HELLOMOUSE
*/
void HelloMouse::OnMouseLeftDown( wxMouseEvent& event )
{
X = event.m_x;
Y = event.m_y;

printf("oh...%d,%d\n",X,Y);
}


/*!
* wxEVT_MOTION event handler for ID_HELLOMOUSE
*/
void HelloMouse::OnMouseMotion( wxMouseEvent& event )
{
if(event.m_leftDown)
{
if(abs(X-event.m_x)>Range)
{
if((X>event.m_x)&&(Direction != 'L'))
{
Direction = 'L';
printf("L");
}
if((X {
Direction = 'R';
printf("R");
}
X = event.m_x;
Y = event.m_y;
}
if(abs(Y-event.m_y)>Range)
{
if((Y>event.m_y)&&(Direction != 'U'))
{
Direction = 'U';
printf("U");
}
if((Y {
Direction = 'D';
printf("D");
}
X = event.m_x;
Y = event.m_y;
}
}
}


/*!
* wxEVT_LEFT_UP event handler for ID_HELLOMOUSE
*/
void HelloMouse::OnMouseLeftUp( wxMouseEvent& event )
{
X = 0;
Y = 0;
Direction = NULL;
printf("\n");
}

2008年8月28日 星期四

電腦猜數字....

最近無聊上班太無聊
所以開始研究些有的沒的東西
於是想說研究看看電腦猜數字的程式的演算法是怎麼做到的
昨天大概想了一下還是不知道該如何下手
於是上Google找了一下...結果還真的是很多丫....
而且還人家還附上原始碼呢!!
參考網址:http://www.javaworld.com.tw/jute/post/view?bid=35&id=35423&sty=1&tpg=1&age=0

其實這方法的邏輯非常的簡單...
只分幾個步驟如下

Step1:

產生一個陣列存放所有可能的答案
如:{0123,0124,0125,.......,9875,9876}

Step2:

從所有可能中找出一個數來猜
如:第一個0123

Step3:

由玩家所填入的?A?B去判斷所有答案中符合這條件的所有的數
因為....由正解和你猜的數分析會是?A?B那也表示反推也是一樣的答案
然後將不符合條件的數設為-1
如:假設答案是5432
則0123得到0A2B
如果把0123當解答的話 你猜5432得到的也是0A2B
所以說你現在是反推的方式去想...只有和0123比較會得到0A2B的數才有可能是解答
也就是說其他不可能的數就可以刪除掉了

Step4:

重覆Step2~Step3就可以很快的得到答案了


所以一切就是這麼的簡單....

2008年8月22日 星期五

[Python]用DBus和Pidgin通訊

要用Python呼叫正在執行中的Pidgin其實非常的簡單
只要你的Pidgin的DBus的Function正常執行
可以用這行程式檢查

$dbus-monitor type=signal interface="im.pidgin.purple.PurpleInterface"


這是監聽DBus上由"im.pidgin.purple.PurpleInterface"所發出的訊號
看得到回應就是有,看不見就是沒有

如果你的DBus Function正常執行的話
你只要在Python 的前面import 進dbus
再加點設定就OK了
就像這樣

import dbus bus = dbus.SessionBus()
obj = bus.get_object("im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject")
purple = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface")


接著就能在程式中呼叫pidgin中的Dbus函式了

如以下是一個登入的function
def login(account_protocol, account_name, account_pass):
account = purple.PurpleAccountNew(account_name, account_protocol)
purple.PurpleAccountSetPassword(account, account_pass)
purple.PurpleAccountsAdd(account) purple.PurpleAccountSetEnabled(account,"gtk-gaim",1)
purple.PurpleBlistSetVisible(1)



其他的參考資訊可在Pidgin官網查到
http://developer.pidgin.im/wiki/DbusHowto

2008年6月21日 星期六

[Python]Glade加Python的GUI設計入門

已經有一段時間沒有用Glade和Python寫程式了
為了怕自己忘記...所以還是記錄下來好了
首先在開始之前....要先安裝以下套件
Python....這是一定要的...不然程式不可能會Run
Glade3.... 這在開發階段是必須的...方便視窗的制作...當然還有別的方法可以做...那之後再討論
PyGtk.... 這也是必要的圖形介面的API
然後就是一步一步的開始程式設計

首先開啟Glade3



產生一個Frame




接著產生一個box(hbox或vbox都可以差別在直的排列或橫向排列)
設定切成幾份...這是切三份


然後放入元件...這邊放了一個Label和一個Text加一個hbox

在hbox中再放入兩個button...如此一來畫面就差不多完成了


接下來設定事件



最後就可以開始程式設計了...

程式碼如下:

#!/bin/python
import gtk.glade
import gtk
import pygtk

class View:
def __init__(self):
#載入glade檔
self.UI = gtk.glade.XML("View.glade")
#載入視窗
self.window = self.UI.get_widget("window1")

#戴入元件
self.btn1 = self.UI.get_widget("eventbox1")
self.btn2 = self.UI.get_widget("eventbox2")

#顯示視窗畫面
self.window.show_all()

#設定事件
dic = {"on_window1_destroy": gtk.main_quit,
"on_btn1_button_press_event":self.on_btn1_button_press_event,
"on_btn2_button_press_event":self.on_btn2_button_press_event
}

#連接事件
self.UI.signal_autoconnect(dic)

#事件的Function
def on_btn1_button_press_event(self,widget,event):
print "hello"

def on_btn2_button_press_event(self,widget,event):
print "world"

#以下為程式進入點
def main():
gtk.main()

if __name__ == "__main__":
tvexample = View()
main()



這是完成的畫面...