Home
  Software
    HowTo
      GooCanvas
        Intro

Idioma:
  English

Temas
  Intro
  Ventana
  Canvas
  Caja
  Capa
  Texto
  Caja1
  Reloj
  Reloj1

Introducción a GooCanvas

Demo GooCanvas

Los elementos gráficos de GooCanvas generan eventos que podemos aprovechar. En este último ejemplo, utilizamos eventos del mouse (button-press-event, button-release-event, motion-notify-event de fondo del reloj para poder mover al reloj.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
#  demo_goocanvas_0.py
#  
#  Copyright 2019 John Coppens <john@jcoppens.com>
#  
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#  
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#  
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.
#  
#  


import gi
gi.require_version('Gtk', '3.0')
gi.require_version('GooCanvas', '2.0')
from gi.repository import Gtk, GLib, GooCanvas
from math import sin, cos, pi
import time

CLK_SIZE = 40
SEC_SIZE = CLK_SIZE
MIN_SIZE = CLK_SIZE * 0.8
HR_SIZE  = CLK_SIZE * 0.5
D_SEC    = 2 * pi / 60


class Clock(GooCanvas.CanvasGroup):
    def __init__(self, parent, x = 0, y = 0):
        super(Clock, self).__init__(
                    parent = parent,
                    x = x, y = y)
        self.dragging = False
        
        self.outer = GooCanvas.CanvasEllipse(
                    parent = self,
                    x = 0, y = 0,
                    radius_x = CLK_SIZE, radius_y = CLK_SIZE,
                    line_width = 3.0,
                    stroke_color_rgba = 0x00ffff80,
                    fill_color_rgba   = 0xff00ff20)

        self.outer.connect("button-press-event", self.on_button_pressed)
        self.outer.connect("button-release-event", self.on_button_released)
        self.outer.connect("motion-notify-event", self.on_motion_notification)

        self.secs = GooCanvas.CanvasPolyline(
                    parent = self,
                    line_width = 1.0,
                    stroke_color = "White")
        
        self.mins = GooCanvas.CanvasPolyline(
                    parent = self,
                    line_width = 2.0,
                    stroke_color = "Yellow")

        self.hrs = GooCanvas.CanvasPolyline(
                    parent = self,
                    line_width = 4.0,
                    stroke_color = "Yellow")

        self.update_clock(0, 0, 0)
        GLib.timeout_add(1000, self.tick)


    def on_button_pressed(self, src, tgt, event):
        self.dragging = True
        self.xref, self.yref = event.x, event.y


    def on_button_released(self, src, tgt, event):
        self.dragging = False
        self.x, self.y = event.x, event.y


    def on_motion_notification(self, src, tgt, event):
        if self.dragging:
            dx = event.x - self.xref
            dy = event.y - self.yref
            self.xref = event.x
            self.yref = event.y
            self.set_property("x", self.get_property("x") + dx)
            self.set_property("y", self.get_property("y") + dy)


    def tick(self):
        t = time.localtime()
        self.update_clock(t.tm_hour, t.tm_min, t.tm_sec)
        return True


    def hand_at(self, angle, size):
        points = GooCanvas.CanvasPoints.new(2)
        points.set_point(0, 0, 0)
        points.set_point(1,  size * cos(-angle * D_SEC + pi/2),
                            -size * sin(-angle * D_SEC + pi/2))
        return points

        
    def update_clock(self, h, m, s):
        # update seconds
        self.secs.set_property("points", self.hand_at(s, SEC_SIZE))
        
        # update minutes
        self.mins.set_property("points", self.hand_at(m+s/60, MIN_SIZE))
        
        # update hours
        self.hrs.set_property("points", self.hand_at((h+m/60)*5, HR_SIZE))



class MainWindow(Gtk.Window):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.connect("destroy", lambda x: Gtk.main_quit())
        self.set_size_request(400, 300)

        # Create the GooCanvas widget
        cv = GooCanvas.Canvas()
        # And ask for access to the root layer
        layer0 = cv.get_root_item()

        # Let's draw a rectangle on the root layer
        rect = GooCanvas.CanvasRect(
                    parent = layer0,
                    x = 20, y = 40,
                    width = 80, height = 120,
                    line_width = 1.0,
                    stroke_color = "yellow",
                    fill_color = "green")

        # Create a new layer, offset by x=130, and y=50
        layer1 = GooCanvas.CanvasGroup(
                    parent = layer0,
                    x = 130, y = 50)

        # And draw a text at the new layer's origin
        text = GooCanvas.CanvasText(
                    parent = layer1,
                    x = 0, y = 0,
                    text = "John",
                    font = "Serif 60",
                    fill_color_rgba = 0xff00ffff)

        # Draw a square using a polyline, also at the origin
        line = GooCanvas.CanvasPoints.new(4)
        line.set_point(0, 0, 0)
        line.set_point(1, 30, 0)
        line.set_point(2, 30, 30)
        line.set_point(3, 0, 30)
        
        poly1 = GooCanvas.CanvasPolyline(
                    parent = layer1,
                    points = line,
                    close_path = True,
                    line_width = 2.0,
                    stroke_color = "red")

        # Instantiate a Clock object. The clock has its own layer.
        # The clock will start itself and sync to the system clock
        self.clock = Clock(
                    parent = layer0,
                    x = 200, y = 200)

        self.add(cv)
        self.show_all()

    def run(self):
        Gtk.main()


def main(args):
    mainwdw = MainWindow()
    mainwdw.run()

    return 0

if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))
Código: demo_goocanvas_7.py

7457
(c) John Coppens ON6JC/LW3HAZ correo