เขียน Theme สำหรับ Superkaramba ด้วย Python

 

คราวก่อนขุดโปรแกรม resize รูปมาขาย คราวนี้ขุดของเก่ามาขายอีกแล้ว :) กับการเขียน theme (หรือ widget) ของ Superkaramba

Superkaramba คือโปรแกรมหรือเครื่องมือที่ช่วยให้คุณสร้างวิดเจ็ตต่างๆ ขึ้นมาบน KDE ครับ ปัจจุบันก็รวมตัวเป็นส่วนหนึ่งของ KDE เป็นที่เรียบร้อย

ประโยชน์ของ widget ก็มีหลายอย่าง เช่น อาจจะใช้ในการ monitor ระบบ, ใช้ดูพยากรณ์อากาศ, ใช้ดึง feed, ฯลฯ การเขียน theme โดยส่วนใหญ่สำหรับใช้ monitor ระบบ เช่น การใช้ CPU, ดิสก์, หน่วยความจำก็จะมีคำสั่งเขียนง่ายๆ ในการสร้าง theme อยู่แล้วในไฟล์ .theme ซึ่งเป็น text file ธรรมดาๆ โดยลองดูรูปแบบการเขียนได้ ที่นี่ แต่สำหรับบางอย่างที่ทางนี้ไม่ได้เตรียมไว้ให้ ผู้สร้าง theme ก็สามารถเขียนเพิ่มเติมเข้าไปได้โดยใช้ภาษา python ครับ โดยจะแบ่งเป็น 2 ส่วน คือส่วนโปรแกรมหรือฟังก์ชั่นที่เราต้องการให้มี และส่วนของการแสดงผลใน Superkaramba

ส่วนโปรแกรมหรือฟังก์ชั่นนั้น เขียนโดยใช้ module มาตรฐาน (หรือเพิ่มเติมก็ตามใจ) ของ Python ได้เลย แต่ส่วนของการแสดงผลนั้น ต้องใช้ API ที่ superkaramba เตรียมไว้ให้ แต่ก็ยังต้องใช้ไฟล์ .theme เหมือนเดิม การเรียกใช้งานนั้น ไม่สามารถเรียกที่ตัว .py ได้โดยตรง แต่จะเป็นการเรียก .theme ซึ่งจะเป็นการไปเรียกโปรแกรม .py ที่มีชื่อเดียวให้ทำงานไปด้วย (Python ที่ใช้เป็น interpreter ตรงนี้เป็น Python ที่ integrated เอาไว้ใน superkaramba ไม่ใช่ Python ที่ลงไว้ในระบบครับ) โดยไฟล์ .py นี้เองทาง superkaramba ก็มี template เตรียมไว้ให้ใช้ โดยจะมีฟังก์ชั่นสำหรับเริ่มวิดเจ็ต และฟังก์ชั่นสำหรับจัดการในเรื่อง interaction เตรียมเอาไว้ให้

ที่ผมจะเสนอต่อไปก็เป็นอะไรที่เขียนไว้นานแล้วเหมือนกัน (แต่นานน้อยกว่าคราวที่แล้ว) คือผมเขียน theme ขึ้นมาตัวนึงให้ทำการ monitor battery (ผมใช้ laptop) โดยสร้างรูปต่างๆ ขึ้นมาตั้งแต่เริ่มโดยใช้ตัวแสดง battery ของ ipod เป็นแบบครับ (ตอนนั้นก็บ้า Apple เหมือนกันนะ จะโดนเรื่อง copyright infringement มั้ยเนี่ย)

ตัวที่ทำการ monitor battery นั้นก็เขียนฟังก์ชั่นโดยใช้ Python ธรรมดา และส่วนแสดงผลก็ใช้ API ของ superkaramba ให้แสดงรูปที่ผมทำขึ้นมา (ไม่มีอะไรพิศดารครับ เพราะตอนนั่งเขียนยังต้องเปิดหนังสือ Python หาคำสั่งอยู่เลย :P)

มาถึงตัวโค้ดครับ พยายามเขียนว่ามันทำอะไรไว้ใน comment แล้วเหมือนเดิมครับ :)

#Battery monitor is a widget theme for Superkaramba using iPod battery graphics.
#It monitors battery via /proc/acpi/battery/BAT0/state and /proc/acpi/battery/BAT0/info files.
#It's my first time doing something with python stuffs, so please be gentle :)
#This script depends on os and karamba modules.
#It can be distributed under GPL.
#-----------------------------------------------------------------------------------------------

#this import statement allows access to the karamba functions
import os
import karamba

#get battery info functions

#see if there's a battery (yes,no) and what is its charging state (charging, discharging and charged).
#This function will return a list of strings, present state of battery and state of charging.
def getBatState():
	output0=os.popen("cat /proc/acpi/battery/BAT0/state")
	state=output0.readlines()
	present=state[0].split()[1]
	if present == "no":
		return [present]
	else:
		charge=state[2].split()[2]
		return [present, charge]
	
#This function will get current charge and capacity of the battery. Then it will calculate percent
#remaining and return a list of float, string and integer, percent with 2 decimals, 
#charge of battery in mAh and percent remaining in integer form.
def getCharge():
	output1=os.popen("cat /proc/acpi/battery/BAT0/info")
	charge0=output1.readlines()
	output2=os.popen("cat /proc/acpi/battery/BAT0/state")
	charge1=output2.readlines()
	fully_charge=charge0[2].split()[3]
	current_charge=charge1[4].split()[2]
		
	f_fully_charge=float(fully_charge)
	f_current_charge=float(current_charge)
	percent=(f_current_charge / f_fully_charge) * 100
	
	if percent > 100:
		percent=100
	
	percent_int=int(percent)
	
	return [percent,current_charge,percent_int]
	

#this is called when your widget is initialized
def initWidget(widget):
	global battBar,redBattBar,chargingBatt,noBatt,chargedBatt,chargeText,percentText
	
	karamba.createBackgroundImage(widget,1,1,"pics/background.png")
	battBar=karamba.createBar(widget,24,32,138,55,"pics/battery_meter.png")
	redBattBar=karamba.createBar(widget,24,32,138,55,"pics/battery_meter_red.png")
	chargingBatt=karamba.createImage(widget,24,32,"pics/battery_meter_charging.png")
	noBatt=karamba.createImage(widget,62,32,"pics/nobatt.png")
	chargedBatt=karamba.createImage(widget,24,32,"pics/battery_charged.png")
	karamba.hideBar(widget,battBar)
	karamba.hideBar(widget,redBattBar)
	karamba.hideImage(widget,noBatt)
	karamba.hideImage(widget,chargedBatt)
	karamba.hideImage(widget,chargingBatt)
	chargeText=karamba.createText(widget,19,90,80,50,"Charge:")
	karamba.changeTextColor(widget,chargeText,130,130,130)
	karamba.changeTextSize(widget,chargeText,10)
	karamba.changeTextShadow(widget,chargeText,-1)
	percentText=karamba.createText(widget,110,90,80,20,"Rem:")
	karamba.changeTextColor(widget,percentText,130,130,130)
	karamba.changeTextSize(widget,percentText,10)
	karamba.changeTextShadow(widget,percentText,-1)
	return
	


#this is called everytime your widget is updated
#the update inverval is specified in the .theme file
def widgetUpdated(widget):
	battPresent = getBatState()
	if battPresent[0] == "no":
		karamba.showImage(widget,noBatt)
		karamba.hideText(widget,percentText)
		karamba.changeText(widget,chargeText,"No battery!")
		karamba.hideBar(widget,battBar)
		karamba.hideBar(widget,redBattBar)
		karamba.hideImage(widget,chargingBatt)
		karamba.hideImage(widget,chargedBatt)
		karamba.redrawWidget(widget)
	else:
		battCharge = getCharge()
		if battPresent[1] == "charging":
			karamba.showImage(widget,chargingBatt)
			karamba.addImageTooltip(widget,chargingBatt,"Charging...")
			karamba.changeText(widget,chargeText,"Charge: %s" % battCharge[1] +" mAh")
			karamba.changeText(widget,percentText,"Rem: %.2f" % battCharge[0] +" %")
			karamba.hideBar(widget,battBar)
			karamba.hideBar(widget,redBattBar)
			karamba.hideImage(widget,noBatt)
			karamba.hideImage(widget,chargedBatt)
			karamba.redrawWidget(widget)
						
		elif battPresent[1] == "charged":
			karamba.showImage(widget,chargedBatt)
			karamba.addImageTooltip(widget,chargedBatt,"Battery is fully charged")
			karamba.changeText(widget,chargeText,"Charge: %s" % battCharge[1] +"mAh")
			karamba.changeText(widget,percentText,"Rem: %.2f" % battCharge[0] +" %")
			karamba.hideBar(widget,battBar)
			karamba.hideBar(widget,redBattBar)
			karamba.hideImage(widget,chargingBatt)
			karamba.hideImage(widget,noBatt)
			karamba.redrawWidget(widget)
			
		elif battPresent[1] == "discharging":
			if battCharge[0] < 28:
				karamba.showBar(widget,redBattBar)
				karamba.setBarMinMax(widget,redBattBar,0,100)
				karamba.setBarValue(widget,redBattBar,battCharge[2])
				karamba.changeText(widget,chargeText,"Charge: %s" % battCharge[1] +" mAh")
				karamba.changeText(widget,percentText,"Rem: %.2f" % battCharge[0] +" %")
				karamba.hideBar(widget,battBar)
				karamba.hideImage(widget,noBatt)
				karamba.hideImage(widget,chargingBatt)
				karamba.hideImage(widget,chargedBatt)
				karamba.redrawWidget(widget)
			
			else:
				karamba.showBar(widget,battBar)
				karamba.setBarMinMax(widget,battBar,0,100)
				karamba.setBarValue(widget,battBar,battCharge[2])
				karamba.changeText(widget,chargeText,"Charge: %s" % battCharge[1] +"mAh")
				karamba.changeText(widget,percentText,"Rem: %.2f" % battCharge[0] +" %")
				karamba.hideImage(widget,chargedBatt)
				karamba.hideImage(widget,noBatt)
				karamba.hideBar(widget,redBattBar)
				karamba.hideImage(widget,chargingBatt)
				
				karamba.redrawWidget(widget)
			
	return

print "Loaded my python extension!"

ส่วนสำหรับตัววิดเจ็ตเองเชิญดาวน์โหลดได้ ที่นี่ ครับ

มีรูปโชว์ครับ :)

ปล. หลังจากลองเขียนตัวนี้แล้ว จริงๆ Python เป็นอะไรที่เขียนค่อนข้างง่ายเหมือนกันนะครับ คือเขียนไล่ลงมาเรื่อยๆ ไม่ค่อยซับซ้อน อ่านโค้ดก็ง่าย ตามลำดับ (แต่จะเขียนให้ยากกับ control flow ก็คงได้มั้ง) แต่ผมก็ยังอ่อนหัดนัก มีอะไรแก้ไขก็เชิญติชมได้นะครับ :)

Comments

 

ดีใจมั่ก ๆ ครับ มีเพื่อนร่วมหัดด้วยกัน ;D

 

Syndicate

Subscribe to Syndicate

Who's online

There are currently 0 users online.