GTk3 et bouton préactivé dans Gtk.dialog avec

Le problème exposé dans ce sujet a été résolu.

Bonsoir à la base dans un Gtk.dialog le code suivant permet de programmer un bouton qui réagit par défaut suite a un appui direct sur touche "enter" ici c'est le bouton a qui ont affecté la réponse Gtk.ResponseType.OK

1
2
3
_buttons = ((gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OK,gtk.RESPONSE_OK))
window = gtk.Dialog('Saisie de texte', None,buttons = _buttons)
window.set_default_response(Gtk.ResponseType.OK) 

j'obtiens bien le bouton gtk.STOCK_OK préactivé et qui réagit à un enter

en revanche pour l'autre façon de gérer les boutons par add_action_widget je ne trouve pas la commande qu'il faut dans le code ci dessous c'est le bouton help et en général le bouton le + à gauche qui prend systématiquement cette option et je ne maîtrise pas du tout l'ordre d'affichage des widgets bizarre !!!!

 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
#!/usr/bin/env python
# coding: utf-8 
#test_dialog_defaultbutton.py
from gi.repository import Gtk

class boite_stockicon_etiquette:
    ''' box with STOCK Icon '''
    def __init__(self,text, stock_icon=None,sizeicon=Gtk.IconSize.MENU):
        # On cree une boite pour la pixmap et l'etiquette
        self.box = Gtk.HBox(False, 0)
        self.box.set_border_width(2)
        # A present l'image.
        if stock_icon is not None:
            image = Gtk.Image.new_from_stock(stock_id=stock_icon,size=sizeicon)             
        else:
            image = Gtk.Image.new_from_stock(stock_id=Gtk.STOCK_OK,size=sizeicon)                 
        # On cree une etiquette pour le bouton.
        etiquette = Gtk.Label(text)
        # pack image and label in the box
        self.box.pack_start(image, False, False, 3)
        self.box.pack_start(etiquette, False, False, 3)

    def box_xpm(self):
        return self.box 

class dialogDefaultButton:
    """ make button with stock icon"""
    def _make_button(self,etiquette=None,stock_icon=None):
        boite1= boite_stockicon_etiquette(etiquette,stock_icon=stock_icon)
        boite = boite1.box_xpm()
        bouton = Gtk.Button()    
        bouton.add(boite)    
        return bouton    

    def __init__(self,text):
        self.dialog = Gtk.Dialog(title="Dialog")

        self.dialog.set_default_size(400, 300)
        self.dialog.set_border_width(10)

        self.dialog.add_action_widget(self._make_button(etiquette=u'Valid',stock_icon=Gtk.STOCK_OK),Gtk.ResponseType.OK)   
        self.dialog.add_action_widget(self._make_button(etiquette=u'Cancel',stock_icon=Gtk.STOCK_CANCEL),Gtk.ResponseType.CANCEL)

        #Please test under with True ou False
        flag_button_valide_setdefault = False

        #if flag_button_valide_setdefault is True the valid button is set like self.dialog.set_default_response(Gtk.ResponseType.OK)
        if flag_button_valide_setdefault is not True:
            self.dialog.add_action_widget(self._make_button(etiquette=u'Add', stock_icon=Gtk.STOCK_ADD),Gtk.ResponseType.APPLY)
            self.dialog.add_action_widget(self._make_button(etiquette=u'Help', stock_icon=Gtk.STOCK_ABOUT),Gtk.ResponseType.HELP)

        label = Gtk.Label(text)

        content_area = self.dialog.get_content_area()
        content_area.add(label)
        self.dialog.show_all()
        #Here action do not run ok why ?
        # Ok only with button created with   add_button



    def run(self):
        while 1:  
            self.reponse = self.dialog.run()
            if self.reponse in [Gtk.ResponseType.OK, Gtk.ResponseType.CANCEL,Gtk.ResponseType.DELETE_EVENT]:
                print("OK sa marche button clicked")
                print self.reponse
                break
            else:
                print 'Hello'

        self.dialog.destroy()         
        return self.reponse

if __name__ == "__main__":
    demo = dialogDefaultButton(text= u'demo of default button depend widget list why?\n\
\n\
if flag_button_valide_setdefault == True , \n\
the valid button is set like self.dialog.set_default_response(Gtk.ResponseType.OK)\n\
if flag_button_valide_setdefault == False \n\
\n\
if somebody could help me to understand what is about !!!!!\n\
in fact I need to have flag_button_valide_setdefault =False\n\
and the valid button set with default response like case of flag==True')
    response = demo.run()
    if response == Gtk.ResponseType.OK:
        print("OK button clicked")
    elif response == Gtk.ResponseType.CANCEL:
        print("Cancel button clicked")
    else:
        print("Dialog closed")

une idée ? merci d'avance de votre aide. Mon souhait est d'agrémenter les boutons avec des petits dessins stockicone

Bonjour, voici un retour sur mon problème et la solution que je ne n'ai trouvé nulle part sur le net. C'est donc peut -être une première mondiale :-) Peu de documentation claire sur le sujet ne facilite pas l'approche. Ce qui m'a mis la puce à l'oreille, c'est au cours de divers tests on ne maîtrise pas toujours l'emplacement du bouton. Donc j'ai cherché l'origine et trouvé !!!!! Dans la construction d'un widget Gtk.dialog avec l'utilisation de bouton, fabriqué à part avec Gtk.Button, puis ajouté par add_action_widget, l'ordre de construction à un rôle à jouer. Ainsi que le type de signal de response. J'ai établi quelques règles issues de mon laboratoire Gtk Python.

Règle N°1 : si on veut un bouton qui soit pré-activé et qui réagisse à un appui direct sur la touche « Enter » sans clic de souris, il doit être créé le premier et se situer tout à gauche dans le Widget.

Règle N°2 : on peut utiliser n'importe quel type de signal réponse associé à un bouton, Gtk ne fait pas de lien. Cela étant utiliser un bouton avec un label Non OK avec un type de réponse Gtk.ResponseType.YES est plutôt source de confusion. Donc à priori gardez une cohérence entre le symbole et le type de réponse. Mais on va voir qu'il va falloir faire une éventuelle entorse.

Règle N°3 : une exception à l'ordre de création concerne le signal de réponse Gtk.ResponseType.HELP. Le widget va le placer automatiquement premier à gauche de l'alignement des boutons et c'est lui qui devient préactivé. Ceci quelque soit l'ordre de création des boutons. (c'est juste cette exception qui m'a créé le problème à priori inextricable).

Règle N° 4 : si on veut à tout prix utiliser un bouton pour l'aide en ligne, et conserver un bouton autre pré-activé comme par exemple un bouton de validation avec un signal Gtk.ResponseType.OK. On créé le premier bouton de validation en application de la règle 1. en application de la règle 2 et 3 on crée un bouton comme ceci : bouton_help = ma_procedure_button(label_help,stock_icon=Gtk.STOCK_HELP), ou ma_procedure_button est la méthode qui fabrique un bouton élaboré, avec son label , cad le texte du bouton et le logo du bouton d'aide self.dialog.add_action_widget(bouton_help,Gtk.ResponseType.NO) en prenant bien garde d'utiliser un type de réponse non utilisé ailleurs dans la même boîte de dialogue et qui ne soit pas Gtk.ResponseType.HELP

autres remarques : compte-tenu de l'existence de ces règles. dialog.set_default_response(response_id) n'a plus de sens et n'est plus opérationnelle sur ma version Version GtK 3.8.10 Version de Python 2.7.6 Egalement on comprend pourquoi la commande dialog.set_alternative_button_order_from_array est dépréciée depuis la version 3.10. pour vous aider à mettre le doigt sur la question j'ai fait un code de test que je vous livre. L'exemple suivant lève donc un coin du voile

 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
#!/usr/bin/env python
# coding: utf-8 
#test_dialog_defaultbutton.py
from gi.repository import Gtk

class boite_stockicon_etiquette:
    ''' box with STOCK Icon '''
    def __init__(self,text, stock_icon=None,sizeicon=Gtk.IconSize.MENU):
        # On cree une boite pour la pixmap et l'etiquette
        self.box = Gtk.HBox(False, 0)
        self.box.set_border_width(2)
        # A present l'image.
        if stock_icon is not None:
            image = Gtk.Image.new_from_stock(stock_id=stock_icon,size=sizeicon)             
        else:
            image = Gtk.Image.new_from_stock(stock_id=Gtk.STOCK_OK,size=sizeicon)                 
        # On cree une etiquette pour le bouton.
        etiquette = Gtk.Label(text)
        # pack image and label in the box
        self.box.pack_start(image, False, False, 3)
        self.box.pack_start(etiquette, False, False, 3)
        """image.show()
        etiquette.show()"""

    def box_xpm(self):
        return self.box 

class dialogDefaultButton:
    """ make button with stock icon"""
    def _make_button(self,etiquette=None,stock_icon=None):
        boite1= boite_stockicon_etiquette(etiquette,stock_icon=stock_icon)
        boite = boite1.box_xpm()
        bouton = Gtk.Button()    
        bouton.add(boite)    
        return bouton    

    def __init__(self,text):
        self.dialog = Gtk.Dialog(title="Dialog")

        self.dialog.set_default_size(400, 300)
        self.dialog.set_border_width(10)

        # code de test pour voir l'ordre des boutons dans le widget
        self.dialog.add_action_widget(self._make_button(etiquette=u'Ok(-5)',stock_icon=Gtk.STOCK_OK),Gtk.ResponseType.OK)   #indice -5
        self.dialog.add_action_widget(self._make_button(etiquette=u'Cancel(-6)',stock_icon=Gtk.STOCK_CANCEL),Gtk.ResponseType.CANCEL) #indice -6
        self.dialog.add_action_widget(self._make_button(etiquette=u'close(-7)', stock_icon=Gtk.STOCK_ABOUT),Gtk.ResponseType.CLOSE)#indice -7
        self.dialog.add_action_widget(self._make_button(etiquette=u'YES(-8)', stock_icon=Gtk.STOCK_ADD),Gtk.ResponseType.YES)#indice -8
        self.dialog.add_action_widget(self._make_button(etiquette=u'NON(-9)', stock_icon=Gtk.STOCK_ADD),Gtk.ResponseType.NO)#indice -9
        self.dialog.add_action_widget(self._make_button(etiquette=u'APPLY(-10)', stock_icon=Gtk.STOCK_ADD),Gtk.ResponseType.APPLY)#indice -10
        # do not use in case of need like these self.info_dlg.set_default_response(Gtk.ResponseType.OK)
        # please check line below with # or not
        self.dialog.add_action_widget(self._make_button(etiquette=u'HELP(-11)', stock_icon=Gtk.STOCK_ADD),Gtk.ResponseType.HELP)#indice -11
        """
        # three next button run ok also Gtk doc may be not update :-)
        self.dialog.add_action_widget(self._make_button(etiquette=u'ACCEPT(-3)', stock_icon=Gtk.STOCK_ADD),Gtk.ResponseType.ACCEPT)#indice -3
        self.dialog.add_action_widget(self._make_button(etiquette=u'REJECT(-2)', stock_icon=Gtk.STOCK_ADD),Gtk.ResponseType.REJECT)#indice -2
        self.dialog.add_action_widget(self._make_button(etiquette=u'FONCTION(42)', stock_icon=Gtk.STOCK_ADD),42)#indice -2
        """        
        label = Gtk.Label(text)

        content_area = self.dialog.get_content_area()
        content_area.add(label)
        self.dialog.show_all()

    def run(self):
        while 1:  
            self.reponse = self.dialog.run()
            if self.reponse in [Gtk.ResponseType.OK, Gtk.ResponseType.CANCEL,Gtk.ResponseType.DELETE_EVENT]:
                print("run OK button clicked (sa marche )")
                print "Gtk.ResponseType is ", self.reponse
                break
            else:
                print 'Hello'
                print "Gtk.ResponseType is ", self.reponse

        self.dialog.destroy()         
        return self.reponse

if __name__ == "__main__":
    demo = dialogDefaultButton(text= u'demo de bouton pour montrer que tout bouton positionné avec un signal de type\n\
Gtk.ResponseType.HELP va avoir une position isolée des autres boutons et même gardera un écart.\n\
\n\
Demo in order to show how manage order button in Gtk.dialog.\n\
Gtk.ResponseType.HELP "give an order" to put help button on the left et the default become help button ')
    response = demo.run()
    if response == Gtk.ResponseType.OK:
        print("OK button clicked")
    elif response == Gtk.ResponseType.CANCEL:
        print("Cancel button clicked")
    else:
        print("Dialog closed")
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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