IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec Python Discussion :

Image sur un bouton chargée dans une boucle


Sujet :

GTK+ avec Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Retraité de l'Informatique
    Inscrit en
    Août 2019
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité de l'Informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2019
    Messages : 36
    Points : 35
    Points
    35
    Par défaut Image sur un bouton chargée dans une boucle
    Bonjour,

    Python 3.7, Gtk 3

    J'essaye donc d'avoir un titre explicite. Détails:
    - j'ai une base Json qui contient des éléments, je boucle dessus pour afficher ces éléments
    - affichage que je fais en grille (grid) car il y a plusieurs champs sur la même ligne de grille
    - un des éléments de la ligne est un bouton
    - si je mets une lettre sur le bouton, pas de problème; tous les boutons de la même colonne sur la grille prennent l'information
    - mais si je mets un image sur le bouton, seule la dernière ligne contient l'image, pas les précédentes
    Le bouton incriminé est le Bouton2. Le bouton3 marque bien le 'D' sur chaque.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    		I = 0
    		for Keys in self.Json_File.keys():
    			.../...
    			WebSiteLetter = WebSite[0]
    			self.Button1=Gtk.Button(label=WebSiteLetter)
    			self.Label3 = Gtk.Label(label=WebSite)
    			self.Label4 = Gtk.Label(label=NumericCode)
     
    			self.Button2 = Gtk.Button()
    			self.Button2.set_image(self.Copy_Icone)
    			self.Button2.set_always_show_image (True)
     
    			self.Button3 = Gtk.Button(label='D')
     
    			self.grid.attach(self.Button1, 0, I, 1, 1)
    			self.grid.attach(self.Label3, 1, I, 1, 1)
    			self.grid.attach(self.Label4, 2, I, 1, 1)
    			self.grid.attach(self.Button2, 3, I, 1, 1)
    			self.grid.attach(self.Button3, 4, I, 1, 1)
    			self.vbox.show_all()
    			I += 1
    Une idée ? Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    Je ne fais pas de python mais je pratique Gtk+ en C.

    En regardant le code source de gtk_button_set_image (); le GtkImage transmis n'est pas copié en interne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    gtk_button_set_image (GtkButton *button,
                          GtkWidget *image)
    {
      GtkButtonPrivate *priv;
      GtkWidget *parent;
      g_return_if_fail (GTK_IS_BUTTON (button));
      g_return_if_fail (image == NULL || GTK_IS_WIDGET (image));
      priv = button->priv;
      if (priv->image)
        {
          parent = gtk_widget_get_parent (priv->image);
          if (parent)
            gtk_container_remove (GTK_CONTAINER (parent), priv->image);
        }
      priv->image = image;
      priv->image_is_stock = (image == NULL);
      gtk_button_construct_child (button);
      g_object_notify_by_pspec (G_OBJECT (button), props[PROP_IMAGE]);
    }
    Essaye de créer un GtkImage pour chaque nouveau bouton plutôt que d'utiliser toujours le même.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Retraité de l'Informatique
    Inscrit en
    Août 2019
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité de l'Informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2019
    Messages : 36
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Bonjour.
    ...
    Essaye de créer un GtkImage pour chaque nouveau bouton plutôt que d'utiliser toujours le même.
    Merci pour la réponse, c'est exactement ça. Il semblerait qu'il faille répéter l'instruction avant chaque utilisation.
    Pour compléter ma réponse, je mets ce petit python de test pour montrer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    import gi
     
    gi.require_version('Gtk', '3.0')
    from gi.repository import Gtk, Gdk, GdkPixbuf, GLib
     
    class SameImageOnMultiButton(Gtk.Window):
     
    	def __init__(self):
     
    		Gtk.Window.__init__(self, title='ImageButton')
    		self.set_border_width(10)
     
    		vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
    		self.add(vbox)
     
    		Pixbuf2 = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename="copy.png", width=32, height=32, preserve_aspect_ratio=True)
     
    		for I in range (10):
    			Button = Gtk.Button()
    			# you must do it for each button
    			Copy_Icone = Gtk.Image.new_from_pixbuf(Pixbuf2)
    			Button.set_image(Copy_Icone)
    			vbox.pack_start(Button, True, True, 0)
     
    GUI = SameImageOnMultiButton()
    GUI.connect("destroy", Gtk.main_quit)
    GUI.show_all()
    Gtk.main()
    J'avais contourné la difficulté avec l'instruction Gtk.Button.new_from_icon_name mais je ne pouvais pas utiliser des icônes personnalisées.
    Encore merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Distinguer des boutons créés dans une boucle
    Par corent2 dans le forum Tkinter
    Réponses: 1
    Dernier message: 09/06/2016, 18h33
  2. Événement bouton clic dans une boucle
    Par pyriame dans le forum C#
    Réponses: 4
    Dernier message: 12/11/2015, 20h13
  3. Bouton "annuler" dans une boucle
    Par buzza01 dans le forum Langage
    Réponses: 2
    Dernier message: 08/08/2011, 20h29
  4. Réponses: 1
    Dernier message: 27/09/2007, 15h31
  5. [FLASH 8] Changer label bouton dynamiquement dans une boucle
    Par Malau dans le forum ActionScript 1 & ActionScript 2
    Réponses: 5
    Dernier message: 03/05/2006, 16h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo