Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- '''
- ctypes-GTK in Blender Test1 - Jan6th 2010
- tested with blender2.55 on ubuntu 8.10 and 10.10
- (should work on any platform with gtk installed)
- Installing:
- 1. download:
- http://rpythonic.googlecode.com/files/ctypes-gtk-test1.tar.bz2
- 2. copy _ctypes_gtk.py to blender/2.5x/scripts/addons/.
- 3. copy this file (addon_gtk_test.py) to blender/2.5x/scripts/addons/.
- 4. go to "User-Prefs->Addons->System" enable Gtk-test1
- 5. click "GTK" in upper right toolbar
- '''
- VERSION = 'gtk in blender test1'
- bl_addon_info = {
- "name": "GTK test1",
- "author": "HartsAntler",
- "version": (0,0,1),
- "blender": (2, 5, 6),
- "location": "Properties",
- "description": "GTK test",
- "warning": "",
- "category": "System"}
- import os, sys, time, hashlib, math, threading
- try:
- import bpy, mathutils
- from bpy.props import *
- except ImportError:
- sys.exit("This script is an addon for blender, you must install it from blender.")
- from _ctypes_gtk import *
- class MyGtkWidget(object):
- def start(self):
- print('running gtk main')
- gtk_main()
- print('gtk exit')
- def start_thread( self ):
- t = threading.Thread(target=self.start)
- print('starting thread')
- t.start()
- #print('joining thread') # dont join the thread so that blender can continue running
- #t.join()
- #print('thread exit')
- def __init__(self):
- self.bobject = None
- gtk_init(
- ctypes.byref( ctypes.c_int(0) ),
- ctypes.byref( ctypes.pointer( ctypes.c_char_p('')))
- )
- self.win_widget = winwidget = gtk_window_new(GTK_WINDOW_TOPLEVEL)
- self.win = win = ctypes.cast( winwidget, ctypes.POINTER(GtkWindow) )
- gtk_window_set_title(win, "ctypes pygtk")
- gtk_window_set_default_size(win, 320, 60)
- #gdk_window_set_keep_above( # not working TODO
- # #ctypes.cast(win, ctypes.POINTER(GdkDrawable)),
- # win.contents.frame,
- # ctypes.c_int(1)
- #)
- gtk_signal_connect_full(
- ctypes.cast(win,ctypes.POINTER(GtkObject)), "destroy", gtk_main_quit,
- None, None, None, ctypes.c_int(0), ctypes.c_int(0)
- )
- self.frame = gtk_frame_new('blender gtk test1')
- gtk_container_add(
- ctypes.cast(win, ctypes.POINTER(GtkContainer)),
- ctypes.cast(self.frame, ctypes.POINTER(GtkWidget))
- )
- self.box = gtk_hbox_new( 0, 2 ) #ctypes.c_int(0), ctypes.c_int(10) )
- gtk_container_add(
- ctypes.cast(self.frame, ctypes.POINTER(GtkContainer)),
- ctypes.cast(self.box, ctypes.POINTER(GtkWidget))
- )
- button = gtk_button_new_with_label("update")
- self.myfunc = func = ctypes.CFUNCTYPE( c_void_p, c_void_p )( self.callback_update )
- gtk_signal_connect_full(
- ctypes.cast(button,ctypes.POINTER(GtkObject)), "clicked", func,
- None, None, None, ctypes.c_int(0), ctypes.c_int(0)
- )
- #gtk_container_add(
- # ctypes.cast(self.box, ctypes.POINTER(GtkContainer)),
- # ctypes.cast(button, ctypes.POINTER(GtkWidget))
- #)
- gtk_box_pack_start(
- ctypes.cast( self.box, ctypes.POINTER(GtkBox) ),
- ctypes.cast( button, ctypes.POINTER(GtkWidget) ),
- 0, 0, 2
- )
- self.label= gtk_label_new('selected')
- gtk_box_pack_start(
- ctypes.cast( self.box, ctypes.POINTER(GtkBox) ),
- ctypes.cast( self.label, ctypes.POINTER(GtkWidget) ),
- 0, 0, 2
- )
- adj = gtk_adjustment_new( .0, -10, 10, 0.01, 1, 1 )
- self.adjust = ctypes.cast(adj, ctypes.POINTER(GtkAdjustment))
- self.myfunc2 = func = ctypes.CFUNCTYPE( c_void_p, c_void_p )( self.callback_adj )
- gtk_signal_connect_full(
- ctypes.cast(adj,ctypes.POINTER(GtkObject)), "value_changed", func,
- None, None, None, ctypes.c_int(0), ctypes.c_int(0)
- )
- self.scale = gtk_hscale_new( self.adjust )
- gtk_box_pack_start(
- ctypes.cast( self.box, ctypes.POINTER(GtkBox) ),
- ctypes.cast( self.scale, ctypes.POINTER(GtkWidget) ),
- 1, 1, 4
- )
- gtk_widget_show_all( winwidget )
- def callback_update(self,*args):
- for ob in bpy.data.objects:
- if ob.select:
- self.bobject = ob
- break
- if self.bobject:
- ob = self.bobject
- self.adjust.contents.value = ob.scale.x
- gtk_label_set_text(
- ctypes.cast(self.label,ctypes.POINTER(GtkLabel)),
- ob.name
- )
- def callback_adj(self,*args):
- if self.bobject:
- ob = self.bobject
- v = self.adjust.contents.value
- ob.scale.x = v
- _GUI_ = None
- class gts_update_op(bpy.types.Operator):
- '''operator: open GTK test'''
- bl_idname = "gtk.start"
- bl_label = "opens the GTK test"
- bl_options = {'REGISTER'} # Options for this panel type
- @classmethod
- def poll(cls, context): return True
- def invoke(self, context, event):
- global _GUI_
- if not _GUI_:
- _GUI_ = MyGtkWidget()
- _GUI_.start_thread()
- return {'FINISHED'}
- class INFO_HT_myheader(bpy.types.Header):
- bl_space_type = 'INFO'
- def draw(self, context):
- layout = self.layout
- op = layout.operator('gtk.start', text='GTK')
- def register(): print( VERSION )
- def unregister(): pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement