[Pycodeocr-main] SF.net SVN: pycodeocr:[70] branches/redesign
Status: Beta
Brought to you by:
drtrigon
|
From: <la...@us...> - 2014-08-28 14:57:09
|
Revision: 70
http://sourceforge.net/p/pycodeocr/code/70
Author: laserb
Date: 2014-08-28 14:57:01 +0000 (Thu, 28 Aug 2014)
Log Message:
-----------
Update tests and add missing files.
Modified Paths:
--------------
branches/redesign/Recognition/__init__.py
branches/redesign/Test/Tests.py
Added Paths:
-----------
branches/redesign/Test/TestGUI.py
branches/redesign/Test/TestScannerGUI.py
branches/redesign/gtkGUI/Chooser.py
branches/redesign/gtkGUI/ImagePreview.glade
branches/redesign/gtkGUI/PropertyWidgets/
branches/redesign/gtkGUI/PropertyWidgets/Coordinates.py
branches/redesign/gtkGUI/PropertyWidgets/Filechooser.py
branches/redesign/gtkGUI/PropertyWidgets/ListChooser.py
branches/redesign/gtkGUI/PropertyWidgets/PropertyWidgetBase.py
branches/redesign/gtkGUI/PropertyWidgets/__init__.py
branches/redesign/gtkGUI/test.py
Removed Paths:
-------------
branches/redesign/Source/Sources.py
Modified: branches/redesign/Recognition/__init__.py
===================================================================
--- branches/redesign/Recognition/__init__.py 2014-08-28 14:37:06 UTC (rev 69)
+++ branches/redesign/Recognition/__init__.py 2014-08-28 14:57:01 UTC (rev 70)
@@ -1,4 +1,5 @@
from Recognition.ImageRecognition import RunRecognition
+from Recognition.ImageRecognition import RecognitionData
from Recognition.Barcode import Barcode
from Recognition.DataMatrix import DataMatrix
from Recognition.DTMX import DTMX
Deleted: branches/redesign/Source/Sources.py
===================================================================
--- branches/redesign/Source/Sources.py 2014-08-28 14:37:06 UTC (rev 69)
+++ branches/redesign/Source/Sources.py 2014-08-28 14:57:01 UTC (rev 70)
@@ -1,33 +0,0 @@
-# -*- coding: utf8 -*-
-
-import sane
-from Source import Scanner
-
-class Sources(object):
- def __init__(self):
- self.sources = []
-
- def searchScanner(self):
- sane.init()
- srcs = sane.get_devices()
- for src in srcs:
- self.sources.append(Scanner(src))
-
- def getSources(self):
- return self.sources
-
- def getSource(self, name):
- for src in self.sources:
- if src.getName() == name:
- return src
-
- def addSource(self, source):
- self.sources.append(source)
-
- def removeSource(self, source):
- i = 0
- for src in self.sources:
- if src.equals(source):
- self.sources.pop(i);
- return
- i = i + 1
Added: branches/redesign/Test/TestGUI.py
===================================================================
--- branches/redesign/Test/TestGUI.py (rev 0)
+++ branches/redesign/Test/TestGUI.py 2014-08-28 14:57:01 UTC (rev 70)
@@ -0,0 +1,114 @@
+# @see http://www.python-kurs.eu/threads.php
+
+import gtk
+from gtkGUI.ProgressBar import ProgressBar
+from gtkGUI.ImagePreview import ImagePreview
+import threading, time
+from PIL import Image
+import Recognition
+
+
+class TestGUI(threading.Thread):
+ def __init__(self, widget, on_button_pressed):
+ threading.Thread.__init__(self)
+ self.widget = widget
+ self.on_button_pressed = on_button_pressed
+
+ # @see https://git.gnome.org/browse/pygtk/tree/examples/gtk/widget.py
+ def run(self):
+ self.win = gtk.Window()
+ self.win.set_border_width(5)
+ self.win.set_title('Widget test')
+ self.win.connect('delete-event', gtk.main_quit)
+
+ frame = gtk.Frame("Example frame")
+ self.win.add(frame)
+
+ hbox = gtk.HBox()
+ frame.add(hbox)
+
+ button = gtk.Button("Click")
+ button.connect("pressed",self.on_button_pressed)
+ hbox.add(button)
+ hbox.add(self.widget)
+
+ self.win.show_all()
+ gtk.main()
+
+
+ ## Refresh window during running processes.
+ def refresh(self):
+ self.win.queue_draw()
+ time.sleep(0.1) # give also some time to the user... :)
+ while gtk.events_pending():
+ gtk.main_iteration()
+
+def progressbar_on_button_pressed(event):
+ for i in range(10):
+ progressbar.nextProgress("clicked " + str(progressbar.getProgress()))
+ t.refresh()
+ print progressbar.getProgress() == 10
+ progressbar.resetProgress("reset")
+ print progressbar.getProgress() == 0
+
+
+def imagePreview_on_button_pressed(event):
+ imagePreview.setOutput("Recognition failed.", False)
+ for i in range(10):
+ t.refresh()
+ imagePreview.setOutput("Success", True)
+ for i in range(10):
+ t.refresh()
+ imagePreview.setOutput("Reset")
+
+def complete_on_button_pressed(event):
+ imagePreview.setOutput("Recognition failed.", False)
+ for i in range(10):
+ progressbar.nextProgress("clicked " + str(progressbar.getProgress()))
+ t.refresh()
+ imagePreview.setOutput("Success", True)
+ for i in range(10):
+ t.refresh()
+ imagePreview.setOutput("Reset")
+ progressbar.resetProgress("reset")
+ for i in range(10):
+ t.refresh()
+
+ image = Image.open("/home/rf/Firefox_wallpaper.png")
+ recognitionData = Recognition.RecognitionData(image)
+ recognitionData.setContent("Data recognized", True)
+ imagePreview.setRecognitionData(recognitionData)
+
+
+# main routin
+if __name__ == '__main__':
+ errors = 0
+ # init tests
+ progressbar = ProgressBar(10)
+ t = TestGUI(progressbar, progressbar_on_button_pressed)
+ t.start()
+ t.join()
+
+ # init tests
+ imagePreview = ImagePreview()
+ image = Image.open("/home/rf/bin/pyCodeOCR/PyCodeOCR.png")
+ imagePreview.setImage(image)
+ t = TestGUI(imagePreview, imagePreview_on_button_pressed)
+ t.start()
+ t.join()
+
+ vbox = gtk.VBox()
+ imagePreview = ImagePreview()
+ image = Image.open("/home/rf/bin/pyCodeOCR/PyCodeOCR.png")
+ imagePreview.setImage(image)
+ progressbar = ProgressBar(10)
+ vbox.pack_start(imagePreview,True,True,0)
+ vbox.pack_end(progressbar,False,False,0)
+ vbox.show_all()
+ t = TestGUI(vbox, complete_on_button_pressed)
+ t.start()
+ t.join()
+
+
+
+
Added: branches/redesign/Test/TestScannerGUI.py
===================================================================
--- branches/redesign/Test/TestScannerGUI.py (rev 0)
+++ branches/redesign/Test/TestScannerGUI.py 2014-08-28 14:57:01 UTC (rev 70)
@@ -0,0 +1,81 @@
+# @see http://www.python-kurs.eu/threads.php
+
+import gtk
+from gtkGUI.ProgressBar import ProgressBar
+from gtkGUI.ImagePreview import ImagePreview
+import threading, time
+from PIL import Image
+import Recognition, Source
+
+
+class TestGUI(threading.Thread):
+ def __init__(self):
+ threading.Thread.__init__(self)
+
+ # @see https://git.gnome.org/browse/pygtk/tree/examples/gtk/widget.py
+ def run(self):
+ srcs = Source.Scanner()
+ srcs.searchScanner()
+ self.source = srcs.activated()[0][1]
+
+ self.win = gtk.Window()
+ self.win.set_border_width(5)
+ self.win.set_title('Widget test')
+ self.win.connect('delete-event', gtk.main_quit)
+
+ frame = gtk.Frame("Example frame")
+ self.win.add(frame)
+
+ hbox = gtk.HBox()
+ frame.add(hbox)
+
+ button = gtk.Button("Click")
+ button.connect("pressed",self.on_button_pressed)
+ hbox.add(button)
+
+ vbox = gtk.VBox()
+ self.imagePreview = ImagePreview()
+ self.progressbar = ProgressBar(10)
+ vbox.pack_start(self.imagePreview,True,True,0)
+ vbox.pack_end(self.progressbar,False,False,0)
+
+ hbox.add(vbox)
+
+ self.win.show_all()
+ gtk.main()
+
+
+ ## Refresh window during running processes.
+ def refresh(self):
+ self.win.queue_draw()
+ time.sleep(0.1) # give also some time to the user... :)
+ while gtk.events_pending():
+ gtk.main_iteration()
+
+ def on_button_pressed(self, event):
+ esr = Recognition.ESR()
+ esr.setRotate([180])
+
+ stdScannerData = Source.StdScannerData()
+ scannerData = stdScannerData.getStdScannerData("180 deg")
+
+
+ runRecognition = Recognition.RunRecognition(self.source, scannerData, esr)
+ runRecognition()
+ self.imagePreview.setRecognitionData(esr.getRecognitionData())
+
+
+# main routin
+if __name__ == '__main__':
+ errors = 0
+ # init tests
+
+
+
+ t = TestGUI()
+ t.start()
+ t.join()
+
+
+
+
Modified: branches/redesign/Test/Tests.py
===================================================================
--- branches/redesign/Test/Tests.py 2014-08-28 14:37:06 UTC (rev 69)
+++ branches/redesign/Test/Tests.py 2014-08-28 14:57:01 UTC (rev 70)
@@ -43,9 +43,9 @@
## Look for some scanners.
def Scanners(self):
print "Test search scanners ..."
- srcs = Source.Sources()
+ srcs = Source.Scanner()
srcs.searchScanner()
- if len(srcs.getSources()) == 0:
+ if len(srcs.activated()[0][1]) == 0:
print "Test failed."
return False
else:
@@ -91,8 +91,9 @@
def TestRecognition(self, source, imageRecognition, image, expected):
print "Test image recognition from file for %s ..." % imageRecognition.getName()
scannerData = Source.ScannerData("default")
- runRecognition = Recognition.RunRecognition(source, scannerData, imageRecognition)
+ runRecognition = Recognition.RunRecognition(source, scannerData, imageRecognition, "")
(check, text) = runRecognition.recognize(image)
+ text = text[0][1]
if check and text == expected:
print "Test passed."
return True
@@ -105,9 +106,9 @@
# @pre A source, an imageRecognition and some parameters
# @post The image gets scanned by the source and recognized by the method specified in imageRecognition.
# The result is checked with what we expected.
- def TestRunRecognition(self, source, parameters, imageRecognition):
+ def TestRunRecognition(self, source, parameters, imageRecognition, recognitionParameters):
print "Test image recognition from %s for %s ..." % (source.getName(),imageRecognition.getName())
- runRecognition = Recognition.RunRecognition(source, parameters, imageRecognition)
+ runRecognition = Recognition.RunRecognition(source, parameters, imageRecognition, recognitionParameters)
(check, msg) = runRecognition()
if check:
print "Test passed."
@@ -130,16 +131,6 @@
if not tests.Scanners():
exit()
- # test reading and storing of scanner properties
- srcs = Source.Sources()
- srcs.searchScanner()
- source = srcs.getSources()[0]
- errors += not tests.SourceProperties(source)
-
- # test adding another source to the source-list
- fileSource = Source.File("./TestImage.jpg","TestImage","file")
- errors += not tests.AddSource(fileSource, "TestImage", "./TestImage.jpg")
-
# test image recognition without using source
esr = Recognition.ESR()
image = Image.open("./TestImage.jpg")
@@ -150,14 +141,14 @@
# test image recognition with ESR from file source
esr = Recognition.ESR()
stdScannerData = Source.StdScannerData()
- errors += not tests.TestRunRecognition(fileSource, "", esr)
+ fileSource = Source.File()
+ errors += not tests.TestRunRecognition(fileSource, ["./TestImage.jpg"], esr, "")
# test image recognition with ESR form scanner source
# esr = Recognition.ESR()
-# esr.setRotate([180])
# stdScannerData = Source.StdScannerData()
# scannerData = stdScannerData.getStdScannerData("180 deg")
-# errors += not tests.TestRunRecognition(source, scannerData, esr)
+# errors += not tests.TestRunRecognition(source, scannerData, esr, "")
print "All test done."
print "Errors: %s" % errors
Added: branches/redesign/gtkGUI/Chooser.py
===================================================================
--- branches/redesign/gtkGUI/Chooser.py (rev 0)
+++ branches/redesign/gtkGUI/Chooser.py 2014-08-28 14:57:01 UTC (rev 70)
@@ -0,0 +1,82 @@
+import inspect
+import gtk
+import PropertyWidgets
+
+class Chooser(gtk.VBox):
+ def __init__(self, members, ignore):
+ #Initialize the VBox
+ gtk.VBox.__init__(self,False,0)
+ self.combobox = gtk.ComboBox()
+ self.add(self.combobox)
+ self.selection = None
+ self.members = members
+ self.ignore = ignore
+ self.list = {}
+
+ self.selectionWidgets = []
+ self.propertyVBox = gtk.VBox()
+ self.add(self.propertyVBox)
+
+ self.propertyWidgets = {}
+ for name, obj in inspect.getmembers(PropertyWidgets):
+ self.propertyWidgets[name] = obj
+
+
+ # init ComboBox
+ self.initComboBox()
+
+ # get list of available classes
+ self.getList()
+
+ def initComboBox(self):
+ self.liststore = gtk.ListStore(str)
+ self.cell = gtk.CellRendererText()
+ self.combobox.set_model(self.liststore)
+ self.combobox.pack_start(self.cell, True)
+ self.combobox.add_attribute(self.cell, 'text', 0)
+ self.combobox.connect("changed", self.getActive)
+
+
+ def getSelection(self):
+ return self.selection
+
+ def getProperties(self):
+ properties = []
+ for widget in self.selectionWidgets:
+ properties.append(widget.getSelection())
+ return properties
+
+ def getList(self):
+ self.list = {}
+ self.liststore.clear()
+ for name, obj in inspect.getmembers(self.members):
+ if name[0] != '_' and not name in self.ignore:
+ self.list[name] = obj
+
+ keys = self.list.keys()
+ keys.sort()
+ for key in keys:
+ self.liststore.append([key])
+ self.combobox.set_active(0)
+ return self.list
+
+ def getActive(self, widget = None):
+ text = self.combobox.get_active_text()
+ self.selection = self.list[text]
+ self.selection = self.selection()
+
+ for widget in self.selectionWidgets:
+ self.propertyVBox.remove(widget)
+
+ self.selectionWidgets = []
+ widgets = self.selection.activated()
+ if widgets:
+ for options in widgets:
+ if options[0] in self.propertyWidgets.keys():
+ widget = self.propertyWidgets[options[0]]
+ widget = widget(options[1])
+ self.selectionWidgets.append(widget)
+ self.propertyVBox.add(widget)
+ widget.show_all()
+ return self.selection
+
\ No newline at end of file
Added: branches/redesign/gtkGUI/ImagePreview.glade
===================================================================
(Binary files differ)
Index: branches/redesign/gtkGUI/ImagePreview.glade
===================================================================
--- branches/redesign/gtkGUI/ImagePreview.glade 2014-08-28 14:37:06 UTC (rev 69)
+++ branches/redesign/gtkGUI/ImagePreview.glade 2014-08-28 14:57:01 UTC (rev 70)
Property changes on: branches/redesign/gtkGUI/ImagePreview.glade
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/xml
\ No newline at end of property
Added: branches/redesign/gtkGUI/PropertyWidgets/Coordinates.py
===================================================================
--- branches/redesign/gtkGUI/PropertyWidgets/Coordinates.py (rev 0)
+++ branches/redesign/gtkGUI/PropertyWidgets/Coordinates.py 2014-08-28 14:57:01 UTC (rev 70)
@@ -0,0 +1,94 @@
+from PropertyWidgetBase import PropertyWidgetBase
+from Source.Scanner import ScannerData
+from Source.Scanner import StdScannerData
+import gtk
+
+class Coordinates(PropertyWidgetBase):
+ def __init__(self, options):
+ super(Coordinates,self).__init__(options)
+ self.stdScannerData = StdScannerData()
+
+ self.profile = gtk.HBox()
+ self.position = gtk.HBox()
+ self.size = gtk.HBox()
+ self.rotation = gtk.HBox()
+
+ self.add(self.profile)
+ self.add(self.position)
+ self.add(self.size)
+ self.add(self.rotation)
+
+ self.initPosition()
+ self.initSize()
+ self.initRotation()
+ self.initprofile()
+
+ self.setProfile("default")
+
+ def initprofile(self):
+ label = gtk.Label("Profiles")
+ self.profileCombobox = gtk.ComboBox()
+ self.liststore = gtk.ListStore(str)
+ self.cell = gtk.CellRendererText()
+ self.profileCombobox.set_model(self.liststore)
+ self.profileCombobox.pack_start(self.cell, True)
+ self.profileCombobox.add_attribute(self.cell, 'text', 0)
+ self.liststore.clear()
+ for data in self.stdScannerData.getStdScannerDatas():
+ self.liststore.append([data.getName()])
+ self.profileCombobox.set_active(0)
+ self.profileCombobox.connect("changed",self.on_profile_changed)
+
+ self.profile.add(label)
+ self.profile.add(self.profileCombobox)
+
+ def on_profile_changed(self, widget = None):
+ profile = self.profileCombobox.get_active_text()
+ self.setProfile(profile)
+
+ def initPosition(self):
+ label = gtk.Label("Position")
+ self.position_x = gtk.SpinButton(None,1,0)
+ self.position_x.get_adjustment().set_all(0,0,1000,1,10,0)
+ self.position_y = gtk.SpinButton(None,1,0)
+ self.position_y.get_adjustment().set_all(0,0,1000,1,10,0)
+
+ self.position.add(label)
+ self.position.add(self.position_x)
+ self.position.add(self.position_y)
+
+ def initSize(self):
+ label = gtk.Label("Size")
+ self.size_x = gtk.SpinButton(None,1,0)
+ self.size_x.get_adjustment().set_all(0,0,1000,1,10,0)
+ self.size_y = gtk.SpinButton(None,1,0)
+ self.size_y.get_adjustment().set_all(0,0,1000,1,10,0)
+
+ self.size.add(label)
+ self.size.add(self.size_x)
+ self.size.add(self.size_y)
+
+ def initRotation(self):
+ label = gtk.Label("Rotation")
+ self.rotate = gtk.SpinButton(None,1,0)
+ self.rotate.get_adjustment().set_all(0,0,360,10,90,0)
+
+ self.rotation.add(label)
+ self.rotation.add(self.rotate)
+
+ def setProfile(self, profile):
+ self.scannerData = self.stdScannerData.getStdScannerData(profile)
+ (position_x, position_y) = self.scannerData.getPosition()
+ (size_x, size_y) = self.scannerData.getSize()
+ self.position_x.set_value(position_x)
+ self.position_y.set_value(position_y)
+ self.size_x.set_value(size_x)
+ self.size_y.set_value(size_y)
+ self.rotate.set_value(self.scannerData.getRotation())
+
+ def getSelection(self):
+ selection = ScannerData("custom")
+ selection.setPosition(self.position_x.get_value_as_int(), self.position_y.get_value_as_int())
+ selection.setSize(self.size_x.get_value_as_int(), self.size_y.get_value_as_int())
+ selection.setRotation(self.rotate.get_value_as_int())
+ return selection
\ No newline at end of file
Added: branches/redesign/gtkGUI/PropertyWidgets/Filechooser.py
===================================================================
--- branches/redesign/gtkGUI/PropertyWidgets/Filechooser.py (rev 0)
+++ branches/redesign/gtkGUI/PropertyWidgets/Filechooser.py 2014-08-28 14:57:01 UTC (rev 70)
@@ -0,0 +1,13 @@
+from PropertyWidgetBase import PropertyWidgetBase
+import gtk
+
+class Filechooser(PropertyWidgetBase):
+ def __init__(self, options):
+ super(Filechooser,self).__init__(options)
+ self.widget = gtk.FileChooserButton("File")
+ self.widget.set_action(gtk.FILE_CHOOSER_ACTION_OPEN)
+ #self.widget = gtk.Label("test")
+ self.add(self.widget)
+
+ def getSelection(self):
+ return self.widget.get_filename()
\ No newline at end of file
Added: branches/redesign/gtkGUI/PropertyWidgets/ListChooser.py
===================================================================
--- branches/redesign/gtkGUI/PropertyWidgets/ListChooser.py (rev 0)
+++ branches/redesign/gtkGUI/PropertyWidgets/ListChooser.py 2014-08-28 14:57:01 UTC (rev 70)
@@ -0,0 +1,30 @@
+from PropertyWidgetBase import PropertyWidgetBase
+import gtk
+
+class ListChooser(PropertyWidgetBase):
+ def __init__(self, options):
+ super(ListChooser,self).__init__(options)
+ self.combobox = gtk.ComboBox()
+ self.add(self.combobox)
+
+ self.initComboBox()
+ self.getList()
+
+ def initComboBox(self):
+ self.liststore = gtk.ListStore(str)
+ self.cell = gtk.CellRendererText()
+ self.combobox.set_model(self.liststore)
+ self.combobox.pack_start(self.cell, True)
+ self.combobox.add_attribute(self.cell, 'text', 0)
+
+
+ def getList(self):
+ self.liststore.clear()
+ for option in self.options:
+ self.liststore.append([option])
+ self.combobox.set_active(0)
+ return
+
+ def getSelection(self):
+ selection = self.combobox.get_active_text()
+ return selection
\ No newline at end of file
Added: branches/redesign/gtkGUI/PropertyWidgets/PropertyWidgetBase.py
===================================================================
--- branches/redesign/gtkGUI/PropertyWidgets/PropertyWidgetBase.py (rev 0)
+++ branches/redesign/gtkGUI/PropertyWidgets/PropertyWidgetBase.py 2014-08-28 14:57:01 UTC (rev 70)
@@ -0,0 +1,10 @@
+import gtk
+
+class PropertyWidgetBase(gtk.VBox):
+ def __init__(self, options):
+ #Initialize the VBox
+ gtk.VBox.__init__(self,False,0)
+ self.options = options
+
+ def getSelection(self):
+ pass
\ No newline at end of file
Added: branches/redesign/gtkGUI/PropertyWidgets/__init__.py
===================================================================
--- branches/redesign/gtkGUI/PropertyWidgets/__init__.py (rev 0)
+++ branches/redesign/gtkGUI/PropertyWidgets/__init__.py 2014-08-28 14:57:01 UTC (rev 70)
@@ -0,0 +1,3 @@
+from Filechooser import Filechooser
+from Coordinates import Coordinates
+from ListChooser import ListChooser
\ No newline at end of file
Added: branches/redesign/gtkGUI/test.py
===================================================================
--- branches/redesign/gtkGUI/test.py (rev 0)
+++ branches/redesign/gtkGUI/test.py 2014-08-28 14:57:01 UTC (rev 70)
@@ -0,0 +1,81 @@
+import gtk, sys
+
+class ComboButton(gtk.HBox):
+
+ def __init__(self,menuitems):
+ gtk.HBox.__init__(self,False,0)
+ """
+ if( !(isinstance(menuitems,types.TupleType) or
+ isinstance(menuitems,type.ListType))):
+ raise(ComboButtonException())
+ """
+ self.set_border_width(2)
+ self.entry = gtk.Entry()
+ menu = gtk.Menu()
+ for i in menuitems:
+ item = gtk.MenuItem(i)
+ item.show()
+ menu.append(item)
+ item.connect( "activate",self.menu_response,i)
+
+ button = gtk.Button()
+ arrow = gtk.Arrow(gtk.ARROW_DOWN,gtk.SHADOW_IN)
+ button.add(arrow)
+ self.progressbar = gtk.ProgressBar()
+ self.pack_start(button,False,False,0)
+ self.pack_end(self.entry,True,True,0)
+ self.pack_end(self.progressbar,True,True,0)
+
+ button.connect("event",self.button_popup,menu)
+
+
+ self.show_all()
+
+ def button_popup(self,widget,event,menu):
+ if event.type == gtk.gdk.BUTTON_PRESS:
+ menu.popup(None,None,None,event.button,event.time)
+ return True
+ return False
+
+ def menu_response(self,widget,str):
+ print "%s was clicked" % str
+ buffer = self.entry.get_text()
+ self.entry.set_text(buffer + str )
+
+
+ def entry_call(self,widget,event):
+ print "event is of %s type" % event.type
+
+ def set_active(self,number):
+ pass
+
+ def get_text(self):
+ return self.entry.get_text()
+
+ def set_text(self,text):
+ self.entry.set_text(text)
+
+def main(args):
+ win = gtk.Window()
+ win.set_border_width(5)
+ win.set_title('Widget test')
+ win.connect('delete-event', gtk.main_quit)
+
+ frame = gtk.Frame("Example frame")
+ win.add(frame)
+
+ w = ComboButton(["a","b"])
+ frame.add(w)
+
+ win.show_all()
+
+ gtk.main()
+
+
+
+# main routin
+if __name__ == '__main__':
+ errors = 0
+
+ # init tests
+ sys.exit(main(sys.argv))
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|