Yup
I have done that with get and set attr...
here is what I have done...
But it doesn't work... if you try it out...
Jason
On Thu, 2008-01-10 at 16:30 -0600, Gryc Ueusp wrote:
> Why not use `model.feat = gtk.ListStore(str, gtk.gdk.Pixbuf)`?
>
> Lines 8-62 scream to me to be one, maybe two classes with some iteration to
> set all the appropriate attributes. I see a LOT of duplication there, and
> that should be about 10 lines at most.
>
> And help(setattr) tells me it needs to be a string, not a variable. You
> should really re-evaluate your use of set/getattr. It doesnt really help
> readability...
>
> On Thursday 10 January 2008 4:40:35 am Jason Brower wrote:
> > http://pastebin.com/d394aac1d
> > I want to take all the code and put it in a loop with get and set attr
> > but I guess I am missing something. It tells me I need to declare
> > model... do I really?
> >
> > :(
> >
> > Jason Brower
> >
> > _______________________________________________
> > Discussion mailing list
> > [EMAIL PROTECTED]
> > http://lists.memaker.org/listinfo.cgi/discussion-memaker.org
>
>
>
> _______________________________________________
> Discussion mailing list
> [EMAIL PROTECTED]
> http://lists.memaker.org/listinfo.cgi/discussion-memaker.org
#!/usr/bin/env python
#-*- coding: utf-8 -*-
# memaker.py - A gtk based avatar creation program.
# Copyright 2007 Jason Brower [EMAIL PROTECTED],
# Christopher Denter (motor AT the-space-station DOT com),
# Aaron C Spike <[EMAIL PROTECTED]>,
# Matthew Brennan Jones <[EMAIL PROTECTED]>
# Og Maciel
# Gryc Ueusp <[EMAIL PROTECTED]>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. See the file LICENSE.
# If not, see <http://www.gnu.org/licenses/>.
import sys , os, fileinput, shutil, rsvg
from motor import *
import pygtk
import gtk
import gtk.glade
import cairo
import StringIO
import pynotify
try:
import Image, ImageChops
except ImportError:
print 'Couldnt find PIL, install `python-imaging` for autogenerated thumbnails.' #Could be a dialog
from image_loader_dummy import *
else:
from image_loader import *
os.chdir(os.sys.path[0])
"""Check directoris if they exist and creat them if they don't"""
def mkdirCheck(newdir):
if os.path.isdir(newdir):
pass
elif os.path.isfile(newdir):
raise OSError("a file with the same name as the desired " \
"dir, '%s', already exists." % newdir)
else:
head, tail = os.path.split(newdir)
if head and not os.path.isdir(head):
print "A required Directory in your Home Directory was needed.... making:", head
os.mkdir(head)
if tail:
print "A required Directory in your Home Directory was needed.... making:", newdir
os.mkdir(newdir)
class MeMakerGui:
def __init__(self):
self.featureList = ["Head","Hair","Eye","Mouth","Ear","Glasses","Nose","Eyebrow","Hat","Accessory","Beard"]
gladefile = "memaker.glade"
self.windowname = "meMaker"
self.currentFace = ObjectStack()
self.meMakerWin = gtk.glade.XML( gladefile, self.windowname )
#Create the default directory structure if not there now....
locationMkDir = os.path.expanduser("~/.MeMaker/features")
mkdirCheck(locationMkDir)
for featureDir in self.featureList:
mkdirCheck(os.path.join(locationMkDir,featureDir.lower()))
#Make a directory for the cache if it doesn't exist.
mkdirCheck(os.path.expanduser("~/.MeMaker/cache"))
#Create the window system for memaker
windowMain = self.meMakerWin.get_widget("meMaker")
windowMain.set_app_paintable(True)
windowMain.hide()
self.featListLoading = []
self.themesIHad = [] # leave empty. this is for remembering which themes we had.
#Now that our main gtk window is ready we can show it.
windowMain.show()
avatarPicture = self.meMakerWin.get_widget("imageAvatar")
loadAbout = self.meMakerWin.get_widget("buttonAbout")
loadAbout.connect('clicked', self.loadAbout)
avatarSaveAs = self.meMakerWin.get_widget("buttonSaveAs")
#avatarSaveAs.connect('clicked', self.saveAsAvatar)
resetAvatar = self.meMakerWin.get_widget("buttonReset")
resetAvatar.connect('clicked', self.avatarReset)
quitMeMaker = self.meMakerWin.get_widget("meMaker")
quitMeMaker.connect('destroy', gtk.main_quit)
buttonUp = self.meMakerWin.get_widget("buttonUp")
buttonUp.connect('clicked', self.arrowUpClicked)
arrowDown = self.meMakerWin.get_widget("buttonDown")
arrowDown.connect('clicked', self.arrowDownClicked)
#Adding the save as combobox
comboboxSaveAs = self.meMakerWin.get_widget("comboboxSaveAs")
comboboxSaveAs.set_active(0)
comboboxSaveAs.connect('changed',self.saveAsChanged)
#Adding the buttons for removing features...
for feat in self.featureList:
buttons = self.meMakerWin.get_widget("buttonRemove"+feat)
buttons.connect('clicked', self.removeFeature)
#Connect all feature iconviews with there proper button presses.
self.modelHead = (gtk.ListStore(str, gtk.gdk.Pixbuf))
self.modelEye = (gtk.ListStore(str, gtk.gdk.Pixbuf))
self.modelEar = (gtk.ListStore(str, gtk.gdk.Pixbuf))
self.modelNose = (gtk.ListStore(str, gtk.gdk.Pixbuf))
self.modelMouth = (gtk.ListStore(str, gtk.gdk.Pixbuf))
self.modelBeard = (gtk.ListStore(str, gtk.gdk.Pixbuf))
self.modelHair = (gtk.ListStore(str, gtk.gdk.Pixbuf))
self.modelEyebrow = (gtk.ListStore(str, gtk.gdk.Pixbuf))
self.modelGlasses = (gtk.ListStore(str, gtk.gdk.Pixbuf))
self.modelHat = (gtk.ListStore(str, gtk.gdk.Pixbuf))
self.modelAccessory = (gtk.ListStore(str, gtk.gdk.Pixbuf))
iconviewHead = self.meMakerWin.get_widget('iconviewHead')
iconviewEye = self.meMakerWin.get_widget('iconviewEye')
iconviewEar = self.meMakerWin.get_widget('iconviewEar')
iconviewNose = self.meMakerWin.get_widget('iconviewNose')
iconviewMouth = self.meMakerWin.get_widget('iconviewMouth')
iconviewBeard = self.meMakerWin.get_widget('iconviewBeard')
iconviewHair = self.meMakerWin.get_widget('iconviewHair')
iconviewEyebrow = self.meMakerWin.get_widget('iconviewEyebrow')
iconviewGlasses = self.meMakerWin.get_widget('iconviewGlasses')
iconviewHat = self.meMakerWin.get_widget('iconviewHat')
iconviewAccessory = self.meMakerWin.get_widget('iconviewAccessory')
iconviewHead.set_model(self.modelHead)
iconviewEye.set_model(self.modelEye)
iconviewEar.set_model(self.modelEar)
iconviewNose.set_model(self.modelNose)
iconviewMouth.set_model(self.modelMouth)
iconviewBeard.set_model(self.modelBeard)
iconviewHair.set_model(self.modelHair)
iconviewEyebrow.set_model(self.modelEyebrow)
iconviewGlasses.set_model(self.modelGlasses)
iconviewHat.set_model(self.modelHat)
iconviewAccessory.set_model(self.modelAccessory)
iconviewHead.set_pixbuf_column(1)
iconviewEye.set_pixbuf_column(1)
iconviewEar.set_pixbuf_column(1)
iconviewNose.set_pixbuf_column(1)
iconviewMouth.set_pixbuf_column(1)
iconviewBeard.set_pixbuf_column(1)
iconviewHair.set_pixbuf_column(1)
iconviewEyebrow.set_pixbuf_column(1)
iconviewGlasses.set_pixbuf_column(1)
iconviewHat.set_pixbuf_column(1)
iconviewAccessory.set_pixbuf_column(1)
iconviewHead.connect('selection-changed', self.featureClicked, self.modelHead)
iconviewEye.connect('selection-changed', self.featureClicked, self.modelEye)
iconviewEar.connect('selection-changed', self.featureClicked, self.modelEar)
iconviewNose.connect('selection-changed', self.featureClicked, self.modelNose)
iconviewMouth.connect('selection-changed', self.featureClicked, self.modelMouth)
iconviewBeard.connect('selection-changed', self.featureClicked, self.modelBeard)
iconviewHair.connect('selection-changed', self.featureClicked, self.modelHair)
iconviewEyebrow.connect('selection-changed', self.featureClicked, self.modelEyebrow)
iconviewGlasses.connect('selection-changed', self.featureClicked, self.modelGlasses)
iconviewHat.connect('selection-changed', self.featureClicked, self.modelHat)
iconviewAccessory.connect('selection-changed', self.featureClicked, self.modelAccessory)
comboboxThemePicker = self.meMakerWin.get_widget("comboboxThemes")
location = "../themes/"
listStore = gtk.ListStore(gtk.gdk.Pixbuf, str)
comboboxThemePicker.set_model(listStore)
px = gtk.CellRendererPixbuf()
text = gtk.CellRendererText()
comboboxThemePicker.pack_start(px, False)
comboboxThemePicker.pack_start(text, False)
comboboxThemePicker.add_attribute(px, "pixbuf", 0)
comboboxThemePicker.add_attribute(text, "text", 1)
themesList = []
for items in os.listdir(location):
if os.path.isdir(location+items):
themesList.append(items)
for items in (themesList):
if (os.path.isdir(location + items)):
image = gtk.gdk.pixbuf_new_from_file(location+items +".png")
listStore.append((image, items))
comboboxThemePicker.connect('changed',self.themeChanged, location, themesList)
linkbuttonDownload = self.meMakerWin.get_widget("linkbuttonDownload")
self.avatarPicture = self.meMakerWin.get_widget("imageAvatar")
self.clearIt = rsvg.Handle("clearIt.svg")
self.avatarPicture.set_size_request(400,400)
self.avatarPicture.connect("expose-event", self.draw_scene)
#Now to load the last theme used
memakerConf = os.path.expanduser("~/.MeMaker/conf.conf")
try:
confFile = file(memakerConf, "r")
themeToLoad = confFile.read()
except IOError:
print "No conf.conf file found. Creating a new one with the default theme."
themeToLoad = "../themes/cocoHead/"
if os.path.isdir(themeToLoad):
self.loadFeatures(themeToLoad)
else:
print "Theme to load was not found. Was it deleted?"
print "Falling back to default theme..."
themeToLoad = "../themes/cocoHead/"
self.loadFeatures(themeToLoad)
self.themesIHad.append(themeToLoad)
print "Loading previous theme:", themeToLoad
if len(themesList) <= 1:
comboboxThemePicker.hide()
linkbuttonDownload.show()
else:
linkbuttonDownload.hide()
def saveAsChanged(self, comboboxSaveAs):
if self.currentFace.amIEmpty():
return
fileType = comboboxSaveAs.get_active_text()
if fileType == "SVG":
locationSave = self.saveLoadFeatures(gtk.FILE_CHOOSER_ACTION_SAVE, "svg",FILE_EXT = {"Scalable Vector Graphics | SVG":"svg"})
file = open(locationSave, "w")
file.write(self.currentFace.printMe())
if fileType == "PNG":
locationSave = self.saveLoadFeatures(gtk.FILE_CHOOSER_ACTION_SAVE, "png",FILE_EXT = {"Scalable Vector Graphics | PNG":"png"})
self.svgHandle = rsvg.Handle(data = self.currentFace.printMe())
cr = self.avatarPicture.window.cairo_create()
self.clearIt.render_cairo(cr)
pixbuf = self.svgHandle.get_pixbuf()
pixbuf.save(locationSave, 'png')
if fileType == "BMP":
locationSave = self.saveLoadFeatures(gtk.FILE_CHOOSER_ACTION_SAVE, "bmp",FILE_EXT = {"Bitmap Image | BMP":"bmp"})
self.svgHandle = rsvg.Handle(data = self.currentFace.printMe())
cr = self.avatarPicture.window.cairo_create()
self.clearIt.render_cairo(cr)
pixbuf = self.svgHandle.get_pixbuf()
pixbuf.save(locationSave, 'bmp')
if fileType == ".face":
self.svgHandle = rsvg.Handle(data = self.currentFace.printMe())
cr = self.avatarPicture.window.cairo_create()
self.clearIt.render_cairo(cr)
pixbuf = self.svgHandle.get_pixbuf()
pixbuf = pixbuf.scale_simple(256,256,gtk.gdk.INTERP_BILINEAR)
pixbufNot = pixbuf
pixbuf.save(os.path.expanduser("~/.face"), 'png')
pynotify.init("MeMaker Notify")
notifier = pynotify.Notification("Profile Updated",
"Your profile avatar has been successfully updated. Changes will take place when you login again.")
helper = gtk.Button()
notifier.set_icon_from_pixbuf(pixbuf.scale_simple(50,50,gtk.gdk.INTERP_BILINEAR))
notifier.show()
if fileType == "Launchpad Logo":
locationSave = self.saveLoadFeatures(gtk.FILE_CHOOSER_ACTION_SAVE, "png",FILE_EXT = {"Scalable Vector Graphics | PNG":"png"})
self.svgHandle = rsvg.Handle(data = self.currentFace.printMe())
cr = self.avatarPicture.window.cairo_create()
self.clearIt.render_cairo(cr)
pixbuf = self.svgHandle.get_pixbuf()
pixbuf = pixbuf.scale_simple(64,64,gtk.gdk.INTERP_BILINEAR)
pixbuf.save(locationSave, 'png')
if fileType == "Launchpad Mugshot":
locationSave = self.saveLoadFeatures(gtk.FILE_CHOOSER_ACTION_SAVE, "png",FILE_EXT = {"Scalable Vector Graphics | PNG":"png"})
self.svgHandle = rsvg.Handle(data = self.currentFace.printMe())
cr = self.avatarPicture.window.cairo_create()
self.clearIt.render_cairo(cr)
pixbuf = self.svgHandle.get_pixbuf()
pixbuf = pixbuf.scale_simple(192,192,gtk.gdk.INTERP_BILINEAR)
pixbuf.save(locationSave, 'png')
if fileType == "Save As...":
pass
comboboxSaveAs.set_active(0)
def themeChanged(self, comboboxThemePicker, featureLocation, themesList):
themeName = comboboxThemePicker.get_active()
themeLocation = featureLocation+themesList[themeName]+"/"
print "Loading theme...", themeLocation
fileSave = file(os.path.expanduser("~/.MeMaker/conf.conf"), "w")
fileSave.write(themeLocation)
self.loadFeatures(themeLocation)
def loadFeatures(self, themeLocation = ""):
notebookFeatures = self.meMakerWin.get_widget("notebookFeatures")
notebookFeatures.set_current_page(0)
self.avatarReset()
progressbarLoading = self.meMakerWin.get_widget("progressbarLoading")
progressbarLoading.show()
comboboxThemePicker = self.meMakerWin.get_widget("comboboxThemes")
comboboxThemePicker.hide()
#for feat in self.featureList:
# getattr(self,'model%s' % feat).clear()
self.modelHead.clear()
self.modelEye.clear()
self.modelNose.clear()
self.modelMouth.clear()
self.modelBeard.clear()
self.modelHair.clear()
self.modelEyebrow.clear()
self.modelGlasses.clear()
self.modelHat.clear()
self.modelAccessory.clear()
self.modelEar.clear()
self.featListLoading = []
for feat in self.featureList:
self.featListLoading.append({'filename':'loading'+feat+'.png','text':'Loading '+feat+'(s)','widget':'iconview'+feat, 'path':themeLocation + feat+'/', 'featureType':feat})
"""This is going to now show the progress window..."""
#progressDialogWindow = self.progressDialog.get_widget("windowLoading")
#progressDialogWindow.show()
#progressbarLoading = self.progressDialog.get_widget("progressbarLoading")
#loadingImage = self.progressDialog.get_widget("imageLoading")
cnt = 0.0
loaderLength = len(self.featListLoading) + 1.0
image_loader = ImageLoader(50, 50, '#000000')
for feature in self.featListLoading:
cnt = cnt + 1
if feature['filename'] != '':
#loadingImage.set_from_file(feature['filename'])
pass
progressbarLoading.set_text(feature['text'])
progressbarLoading.set_fraction(cnt/loaderLength)
while gtk.events_pending():
gtk.main_iteration()
#iconviewWidget= self.meMakerWin.get_widget(feature['widget'])
locationsToLoad = [os.path.expanduser(feature['path'])]
for locationTheme in locationsToLoad:
for items in (os.listdir(locationTheme)):
if os.path.isfile(locationTheme+items) == True:
pixbuf = image_loader.load_cached_image(locationTheme+items)
scaled_buf = pixbuf.scale_simple(50,50,gtk.gdk.INTERP_BILINEAR)
pictureLocation = (locationTheme+items)
if feature['featureType'] == "Head":
self.modelHead.append([pictureLocation , scaled_buf])
if feature['featureType'] == "Eye":
self.modelEye.append([pictureLocation , scaled_buf])
if feature['featureType'] == "Ear":
self.modelEar.append([pictureLocation , scaled_buf])
if feature['featureType'] == "Nose":
self.modelNose .append([pictureLocation , scaled_buf])
if feature['featureType'] == "Mouth":
self.modelMouth.append([pictureLocation , scaled_buf])
if feature['featureType'] == "Beard":
self.modelBeard.append([pictureLocation , scaled_buf])
if feature['featureType'] == "Hair":
self.modelHair.append([pictureLocation , scaled_buf])
if feature['featureType'] == "Eyebrow":
self.modelEyebrow.append([pictureLocation , scaled_buf])
if feature['featureType'] == "Glasses":
self.modelGlasses.append([pictureLocation , scaled_buf])
if feature['featureType'] == "Hat":
self.modelHat.append([pictureLocation , scaled_buf])
if feature['featureType'] == "Accessory":
self.modelAccessory.append([pictureLocation , scaled_buf])
else:
print("Found a folder, but I'm not loading what's inside.")
#Hide out the loader
image_loader.close()
progressbarLoading.hide()
comboboxThemePicker.show()
#progressDialogWindow.hide()
def removeFeature(self, widget):
"""Remove a feature from the stack"""
self.currentFace.deleteFeature(self.getSelectedPage())
self.applyChanges()
def arrowUpClicked(self, widget):
"""Apply changes after the up-arrow has been clicked"""
self.currentFace.raiseFeature(self.getSelectedPage())
self.applyChanges()
def arrowDownClicked(self, widget):
"""Apply changes after the down-arrow has been clicked"""
self.currentFace.lowerFeature(self.getSelectedPage())
self.applyChanges()
def getSelectedPage(self):
"""Take the current notbook page and return it back to the caller with the name of the notebook"""
notebookFeatures = self.meMakerWin.get_widget("notebookFeatures")
testing = notebookFeatures.get_current_page()
return self.featureList[testing].lower()
def avatarReset(self, widget = None):
"""Reset the avatar image to nothing"""
self.currentFace.clearMe()
self.applyChanges()
def loadAbout(self, widget):
"""Open the about diolog"""
aboutDialog = gtk.glade.XML( "memaker.glade", "aboutdialogMeMaker")
frmAbout = aboutDialog.get_widget("aboutdialogMeMaker")
result = frmAbout.run()
frmAbout.destroy()
return result
def featureClicked(self, iconviewList, modelTheme):
indexFeature = iconviewList.get_selected_items()
try:
selectedItems = iconviewList.get_selected_items()[0][0]
locationFeature = modelTheme[selectedItems][0]
except IndexError:
return
self.currentFace.addFeature(locationFeature,self.getSelectedPage())
iconviewList.unselect_all()
self.applyChanges()
def applyChanges(self):
self.avatarPicture.queue_draw()
def draw_scene(self, a, v):
self.svgHandle = rsvg.Handle(data = self.currentFace.printMe())
cr = self.avatarPicture.window.cairo_create()
self.clearIt.render_cairo(cr)
self.svgHandle.render_cairo(cr)
def saveLoadFeatures(self, dialog_action, file_type, file_name="MyAvatar", FILE_EXT = {"Scalable Vector Graphics | SVG":"svg","Bitmap Format | BMP":"bmp","Gnome About Me | .face":".face","JPeg Format | JPG":"JPG","Portable Network Graphic | PNG":"PNG"}):
"""dialog_action - The open or save mode for the dialog either
gtk.FILE_CHOOSER_ACTION_OPEN, gtk.FILE_CHOOSER_ACTION_SAVE
file_name - Default name when doing a save"""
if (dialog_action==gtk.FILE_CHOOSER_ACTION_OPEN):
dialog_buttons = (gtk.STOCK_CANCEL
, gtk.RESPONSE_CANCEL
, gtk.STOCK_OPEN
, gtk.RESPONSE_OK)
else:
dialog_buttons = (gtk.STOCK_CANCEL
, gtk.RESPONSE_CANCEL
, gtk.STOCK_SAVE
, gtk.RESPONSE_OK)
file_dialog = gtk.FileChooserDialog(title="MeMaker Save Avatar"
, action=dialog_action
, buttons=dialog_buttons)
if (dialog_action==gtk.FILE_CHOOSER_ACTION_SAVE):
file_dialog.set_current_name(file_name+"."+file_type)
for extension in FILE_EXT.keys():
filters = gtk.FileFilter()
filters.set_name(extension)
filters.add_pattern("*." + FILE_EXT[extension])
file_dialog.add_filter(filters)
filters = gtk.FileFilter()
filters.set_name("All files")
filters.add_pattern("*")
file_dialog.add_filter(filters)
"""Init the return value"""
result = ""
if file_dialog.run() == gtk.RESPONSE_OK:
result = file_dialog.get_filename()
file_dialog.destroy()
return result
app = MeMakerGui()
gtk.main()
--
ubuntu-art mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-art