使用Moblin開發應用程式 - Clutter之GTK與Clutter
從Clutter的設計目標來看,Clutter是支援與GTK進行互操作的,也就是說,無論是在GTK的程式框架中嵌入Clutter控制元件還是在Clutter程式框架中嵌入GTK控制元件都是支援的。理論歸理論,目前Clutter僅支援在GTK框架中嵌入Clutter程式碼。
要在GTK程式中使用Clutter,首要任務是搭臺,也就是在GTK中為Clutter找到一個Stage。這個任務就交給控制元件GtkClutterEmbed來完成了。GtkClutterEmbed顧名思義就是嵌入在GTK視窗中的Clutter(Stage),它的角色是視窗中的預設Stage。有了這個Stage後,Clutter相關程式碼就與原生Clutter程式碼別無二致了。用GtkClutterEmbed這個控制元件之前,要
#include
在寫程式時不能忘記此時我們是生活在GTK下滴,所以要用gtk main loop, gtk_main_quit(), gtk_...
直接看程式碼吧。
#!/usr/bin/python
import sys
import os
import random
import cluttergtk
import clutter
import gtk
STAGE_WIDTH=1024
STAGE_HEIGHT=768
Dragging = False
DraggingPhoto = None
class Photo:
'''Photo class'''
border_width = 10
def __init__(self, path, stage):
self.stage = stage
self.path = path
self.x = 0
self.y = 0
self.degree = 0
self.drag_start_x = 0
self.drag_start_y = 0
self.pic = clutter.Texture()
self.pic.set_from_file(path)
self.width = self.pic.get_width()+2*Photo.border_width
self.height = self.pic.get_height()+2*Photo.border_width
self.frame. = clutter.Rectangle()
self.frame.set_color(clutter.Color(0xff, 0xff, 0xff, 0xff))
self.frame.set_position(self.x, self.y)
self.frame.set_size(self.width, self.height)
self.group = clutter.Group()
self.group.add(self.frame)
self.group.add(self.pic)
self.pic.set_position(Photo.border_width, Photo.border_width)
self.stage.add(self.group)
self.group.set_reactive(True)
self.group.connect("button-press-event", self.on_button_press)
self.group.connect("button-release-event", self.on_button_release)
self.group.connect("motion-event", self.on_motion)
def set_random_position(self):
stage_width = self.stage.get_width()
stage_height = self.stage.get_height()
left = random.randint(0, stage_width)
top = random.randint(0, stage_height)
degree = random.randint(0, 360)
while left+self.width > stage_width:
left = random.randint(0, stage_width)
while top+self.height > stage_height:
top = random.randint(0, stage_height)
self.set_position(left, top, degree)
def set_position(self, x, y, degree):
self.x = x
self.y = y
self.degree = degree
self.group.set_position(x, y)
self.group.set_rotation(clutter.Z_AXIS, degree, (x+self.width)/2, (y+self.width)/2, 0)
def on_button_press(self, actor, event):
global Dragging, DraggingPhoto
if event.button == 1 and Dragging == False:
Dragging = True
DraggingPhoto = self
self.drag_start_x = event.x
self.drag_start_y = event.y
self.group.raise_top()
return True
def on_motion(self, actor, event):
global Dragging, DraggingPhoto
if event.modifier_state & clutter.BUTTON1_MASK and Dragging == True and DraggingPhoto == self:
dist_x = event.x - self.drag_start_x
dist_y = event.y - self.drag_start_y
self.group.move_by(dist_x, dist_y)
self.drag_start_x = event.x
self.drag_start_y = event.y
return True
def on_button_release(self, actor, event):
global Dragging, DraggingPhoto
if event.button == 1:
Dragging = False
DraggingPhoto = None
return True
def main(args):
if len(args) < 2:
print "The number of arguments is less than 2!"
return -1
path=args[1]
if not os.path.exists(path):
print path, "doesn't exist!"
return -1
window = gtk.Window()
window.connect("destroy-event", gtk.main_quit)
window.set_title("Clutter Photo Viewer")
vbox = gtk.VBox(False, 0)
window.add(vbox)
toolbar = gtk.Toolbar()
tbutton = gtk.ToolButton()
tbutton.set_label("Flimstrip")
toolbar.insert(tbutton, -1)
embed = cluttergtk.Embed()
vbox.pack_start(toolbar, False, False, 0)
vbox.pack_start(embed, True, True, 0)
embed.set_size_request(STAGE_WIDTH, STAGE_HEIGHT)
embed.realize()
stage = embed.get_stage()
stage.set_size(STAGE_WIDTH, STAGE_HEIGHT)
stage.set_color(clutter.Color(0x00, 0x00, 0x00, 0x00))
if not path.endswith(os.sep):
path+=os.sep
filelist = os.listdir(path)
for item in filelist:
pic=Photo(path+item, stage)
pic.set_random_position()
window.show_all()
gtk.main()
return 0
if __name__ == '__main__':
main(sys.argv)
作者: 方亮 (Intel)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21255398/viewspace-594847/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用Moblin開發應用程式 -- Clutter之Actor與Stage
- 用Gtk+開發Linux上的GUI應用軟體(轉)LinuxGUI
- VC++ 環境 使用開發GTK+程式的中文顯示問題C++
- moblin開發環境試裝記事開發環境
- 開發 SOA 應用程式
- 使用 Tye 輔助開發 dotnet 應用程式
- 如何使用 VS Code 開發.NET Core應用程式
- 【T04】開發並使用應用程式框架框架
- 用AJAX開發智慧Web應用程式之基礎篇(轉)Web
- 前端開發規範之React應用使用ESLint前端ReactEsLint
- 應用程式通用開發框架框架
- 使用 Flutter 加速應用開發Flutter
- 使用VS Code開發 除錯.NET Core 應用程式除錯
- 怎樣使用AJAX進行應用程式開發(轉)
- 兩種Oracle應用程式開發介面之簡要分析Oracle
- 開源繪畫應用 Pinta 已移植到GTK 3和.NET 6
- 使用Taro開發鴻蒙原生應用——快速上手,鴻蒙應用開發指南鴻蒙
- 使用 Taro 開發鴻蒙原生應用 —— 快速上手,鴻蒙應用開發指南鴻蒙
- 鴻蒙系統應用開發之開發準備鴻蒙
- java開發系統核心:使用C語言開發系統應用程式JavaC語言
- 使用MyEclipse開發Java EE應用:企業級應用程式專案(下)EclipseJava
- 使用MyEclipse開發Java EE應用:企業級應用程式專案(上)EclipseJava
- 開發Web應用程式中Cookie使用的問題 (轉)WebCookie
- 用低程式碼開發平臺開發應用可靠嗎
- 《iOS應用開發指南——使用HTML5、CSS3和JavaScript》——1.3 移動應用程式≠桌面應用程式iOSHTMLCSSS3JavaScript
- VC開發應用程式答疑 (轉)
- 《反應式應用開發》之“什麼是反應式應用”
- 使用JAVA開發CORBA應用 (轉)JavaORB
- 低程式碼應用程式開發開始興起
- 開始使用 Python 開發 Web 應用PythonWeb
- 《iOS應用開發指南——使用HTML5、CSS3和JavaScript》——1.3節移動應用程式≠桌面應用程式iOSHTMLCSSS3JavaScript
- Yeoman:Web 應用開發流程與工具Web
- iOS 11開發教程(十八)iOS11應用檢視之使用程式碼新增按鈕iOS
- 在零程式碼開發平臺上如何開發應用程式
- 在Delphi中開發使用多顯示器的應用程式
- Linux下應用程式開發:使用QT製作Skin(轉)LinuxQT
- VC++串列埠程式設計之簡訊應用開發(轉)C++串列埠程式設計
- Cordova - 使用Cordova開發iOS應用實戰1(配置、開發第一個應用)iOS