Hi Mawe,
hier ein Beispiel mit einem abgeleiteten Drawing-Area als Button.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Modul: Test
Description: Description
Version: 0.1
Copyright: 2004 by Fritz Cizmarov fritz@sol.at
Created: 08. Feb. 2005
Last modified: 09. Feb. 2005
License: Python license
Requirements: Python2.3
Exports: Classes and Functions to export
"""
import pygtk
pygtk.require('2.0')
import gtk
import pango
class ElementButton(gtk.DrawingArea):
""" Button fuer "Chemische Elemente Tafel" """
def __init__(self, text, foreground, background):
super(ElementButton, self).__init__()
# Farben reservieren
self.colormap = self.get_colormap()
self.fg = self.colormap.alloc_color(foreground)
self.bg = self.colormap.alloc_color(background)
self.light = self.colormap.alloc_color("#f8f8f8")
self.dark = self.colormap.alloc_color("#070707")
# Groesse nach Zeichensatz berechnen und setzen
self.layout = pango.Layout(self.create_pango_context())
self.layout.set_text("XXXX\nXXXX\nXXXX") # 3 Zeilen a 4 Zeichen
self.width, self.height = self.layout.get_pixel_size()
self.set_size_request(self.width, self.height)
# Pangolayout erstellen und Position berechnen
self.layout.set_markup(text)
t_width, t_height = self.layout.get_pixel_size()
self.l_x = (self.width - t_width) / 2
self.l_y = (self.height - t_height) / 2
# Event BUTTON_PRESS aktivieren
self.set_events(self.get_events() | gtk.gdk.BUTTON_PRESS_MASK)
self.connect("realize", self.on_realize)
self.connect("expose_event", self.on_expose_event)
def on_realize(self, event):
# Widget erstellt, graphical context holen
self.gc = self.window.new_gc()
return True
def on_expose_event(self, area, event):
# Widget neu zeichnen
self.gc.set_foreground(self.bg)
self.window.draw_rectangle(self.gc, True, 0, 0, self.width, self.height)
# 3D-Border
self.gc.set_foreground(self.light)
self.window.draw_line(self.gc, 0, 0, self.width, 0)
self.window.draw_line(self.gc, 0, 0, 0, self.height)
self.gc.set_foreground(self.dark)
self.window.draw_line(self.gc, self.width-1, 0,
self.width-1, self.height)
self.window.draw_line(self.gc, 0, self.height-1,
self.width, self.height-1)
# Text zeichnen
self.window.draw_layout(self.gc,
self.l_x, self.l_y,
self.layout, self.fg)
return True
class Test:
def __init__(self):
self.root = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.root.connect("destroy", lambda w: gtk.main_quit())
button_text = "<small>2</small>\n<b>He</b>\n<small>4.002</small>"
button = ElementButton(button_text, "#ff0000", "#0000ff")
button.connect("button_press_event", self.on_button_press_event)
self.root.add(button)
button.show()
self.root.show()
gtk.main()
def on_button_press_event(self, widget, event):
print widget.layout.get_text() # oder sonst eine Aktion
return True
Test()
in der Methode
.on_expose_event wird auch noch ein Pseudo3D-Rahmen um den Button gezeichnet dort kannst du auch sonsitge Zeichenoperationen hinzufügen oder sonstwas.
Gruß
Dookie