Affichage d'un Drawing Area dans un Fixed avec GTK3

a marqué ce sujet comme résolu.
Auteur du sujet

Bonjour,

dans la conception d’un logiciel avec GTK3 et Python3, je me dois d’interagir avec un drawing area via des boutons, j’ai donc pensé mettre les boutons et mon aire de dessin dans un Fixed, j’ai bien tous mes boutons d’affiché mais pas le drawing area qui est poutant bien présent sur la fenêtre (on peut le deviner car la fenêtre s’agrandit quand je le déplace), il est donc juste pas visible. J’ai essayé d’ajouter des "show_all" et des "queue_draw" un peu partout mais rien n’y fait. Une idée de comment régler ce problème ?

Merci d’avance !

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
from gi.repository import Gtk, Gdk
import cairo


class MyWindow(Gtk.Window):

    def __init__(self, modifiable):
        super(MyWindow, self).__init__()
        self.width, self.height = 120,20
        self.modifiable = modifiable
        self.init_ui()


    def init_ui(self):
        self.set_title("Test Rectangle Move")
        self.resize(600, 400)
        self.set_position(Gtk.WindowPosition.CENTER)

        self.darea = Gtk.DrawingArea()
        self.darea.connect("draw", self.on_draw)
        self.darea.set_events(Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.POINTER_MOTION_MASK)

        self.darea.connect("button-press-event", self.on_button_press)
        self.darea.show_all()
        self.darea.connect("delete-event", Gtk.main_quit)

        self.fixed = Gtk.Fixed()
        self.fixed.put(self.darea,0,0)

        self.add(self.fixed)
        self.show_all()

        self.rects = [rectangle(20,10,50,80), rectangle(100,10,70,80)]


    def on_draw(self, wid, cr):
        cr.set_source_rgb(255,0, 0)
        #cr.set_line_width(0.5)
        cr.fill()

        for rect in self.rects:
            if rect.isSelected: cr.set_source_rgb(0,255, 0)
            if rect.is2Selected: cr.set_source_rgb(0,0, 255)
            cr.rectangle(rect.position[0], rect.position[1], rect.width, rect.height)
            cr.fill()
            cr.stroke()
            if rect.isSelected or rect.is2Selected: cr.set_source_rgb(255,0, 0)

    def on_mouse_bg(self, w, e):
        if self.modifiable:
            for rect in self.rects:
                if rect.isSelected:
                    rect.npos(e.x)
                elif rect.is2Selected:
                    rect.nwidth(e.x)
            self.darea.queue_draw()


    def on_button_press(self, w, e):

        if e.type == Gdk.EventType.BUTTON_PRESS \
            and e.button == MouseButtons.LEFT_BUTTON:
            for rect in self.rects:
                if rect.contient(e.x, e.y):
                    rect.select()
                else:
                    rect.unselect()
            self.darea.queue_draw()

        if e.type == Gdk.EventType.BUTTON_PRESS \
            and e.button == MouseButtons.RIGHT_BUTTON:
            for rect in self.rects:
                if rect.contient(e.x, e.y):
                    rect.select2()
                else:
                    rect.unselect2()
            self.darea.queue_draw()


class rectangle(object):
    def __init__(self, posX, posY, width, height):
        super(rectangle, self).__init__()
        self.width = width
        self.height= height
        self.position = [posX,posY]
        self.isSelected = False
        self.is2Selected = False

    def select(self):
        self.isSelected = True

    def select2(self):
        self.is2Selected = True

    def unselect(self):
        self.isSelected = False

    def unselect2(self):
        self.is2Selected = False

    def nwidth(self, posX):
        if (self.position[0] < posX): self.width = posX - self.position[0]

    def npos(self, posX):
        self.position[0] = posX

    def contient(self, posX, posY):
        if(posX > self.position[0] and posX < self.position[0] + self.width and posY > self.position[1] and posY < self.position[1]+ self.height): return True
        return False


def main():
    app = MyWindow(True)
    Gtk.main()

"AH AH" indiqua le perspicace Bosse-de-Nage, à qui rien n’échappait

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte