PyGtk: Bei Button click rechteck zeichnen.

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

PyGtk: Bei Button click rechteck zeichnen.

Beitragvon Treehouse » 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

Mal ein Beispiel

Beitragvon Treehouse » 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

Beitragvon Trundle » 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

Beitragvon Treehouse » 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.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder