Seite 1 von 1

PyGtk: Bei Button click rechteck zeichnen.

Verfasst: Donnerstag 27. März 2008, 12:26
von Treehouse
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

Mal ein Beispiel

Verfasst: Donnerstag 27. März 2008, 22:18
von Treehouse
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.

Verfasst: Freitag 28. März 2008, 10:26
von Trundle
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.

Verfasst: Freitag 28. März 2008, 12:03
von Treehouse
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.