PyGtk: Bei Button click rechteck zeichnen.

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Treehouse
User
Beiträge: 39
Registriert: Freitag 14. Dezember 2007, 00:40

Donnerstag 27. März 2008, 12:26

Hallo,

ich stehe gerade vor dem Problem das ich auf Knopf druck ein Rechteck zeichnen will. Das Problem ist aber das ich es nur hinbekomme wenn ich es mit `expose-events ` ganz am Anfang wenn das Fenster gezeichnet wird hinbekomme.

Kann mir vielleicht jemand sagen wie man im nachhinein in eine drawing aera ein rechteck zeichnet?

Gruß

Treehouse
Treehouse
User
Beiträge: 39
Registriert: Freitag 14. Dezember 2007, 00:40

Donnerstag 27. März 2008, 22:18

Vielleicht ist es ja an einem kleinen Beispiel einfacher zu erklären worauf ich hinaus will.

Also gegeben ist folgender Code:

Code: Alles auswählen

#! /usr/bin/env python

import pygtk
pygtk.require('2.0')
import gtk


class ImagesExample:
    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.connect('destroy', lambda w: gtk.main_quit())
       
        self.area = gtk.DrawingArea()
        self.area.set_size_request(200, 200)
        self.window.add(self.area)
        self.area.connect('expose-event', self.area_expose)
       
        self.area.show()
        self.window.show()
   
    def area_expose(self, area, event):
        graphics_context = self.area.window.new_gc()
        self.area.window.draw_rectangle(graphics_context, True, 30,30 , 100,100)
        return True


def main():
    ImagesExample()
    gtk.main()

main()
Nun will ich wenn ich auf einen Button clicke dieses Rechteck verändern von seinen Ausmaßen her. Nur verstehen ich nicht ganz wie man sowas anstellt. Vielleicht kann mir da ja jemand von euch auf die Sprünge helfen.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Freitag 28. März 2008, 10:26

Du rufst die `queue_draw`-Methode der DrawingArea auf, wodurch die DrawingArea neu gezeichnet wird und dabei wird auch ein `expose-event`-Signal ausgelöst. Und dann im Signal-Handler das Rechteck eben anders zeichnen.
Treehouse
User
Beiträge: 39
Registriert: Freitag 14. Dezember 2007, 00:40

Freitag 28. März 2008, 12:03

Hi Trundle,


ich habe gerade eben das rausgefunden. Warst einen Tick schneller mit der Antwort.

Aber wie immer besten Dank an dich, bist echt ein Meister deines Fachs.

Hier mal die Lösung:

Code: Alles auswählen

#! /usr/bin/env python

import pygtk
pygtk.require('2.0')
import gtk


class ImagesExample:
    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.connect('destroy', lambda w: gtk.main_quit())
    
       	#button
       	self.button = gtk.Button()
       	self.button.set_label('Change')
       	self.button.connect('clicked', self.on_change)
       	
       	# abmessungen
       	self.width = 30
       	self.height = 100
       	
        self.area = gtk.DrawingArea()
        self.area.set_size_request(200, 200)

        # vbox
        vbox = gtk.VBox(2)        
        vbox.add(self.area)
        vbox.add(self.button)
        
        self.window.add(vbox)
        self.area.connect('expose-event', self.area_expose)
       
        self.area.show()
        self.window.show_all()
    
    def on_change(self, data):
		self.width = 200
		self.height = 200
		self.area.queue_draw()

    def area_expose(self, area, event):
        graphics_context = self.area.window.new_gc()
        self.area.window.draw_rectangle(graphics_context, True, 0,0 , self.width, self.height)
        return True

		
def main():
    ImagesExample()
    gtk.main()

main()
Also die Lösung ist weit weg von jedlichem Desgin es geht ja auch nur darum die Funktionalität zu erläutern.
Antworten