2016-04-24 3 views
1

ich loocking für jede Idee setzen mein ProblemWie Standardantwort auf die Schaltfläche mit add_action_widget in Gtk.Dialog

Bitte sehen Code folgen zu lösen. Es ist eine Demo zu erklären, was ist In der Tat muss ich add_action_widget verwenden, um Button hinzufügen, um Button mit Bild hinzufügen. Wenn ich add_action_widget und add_button Widget mischen, sind nicht die gleiche vertikale Größe und es ist hässlich.

würde ich Gebrauch nur add_action_widget und fähig sein mag gültige Taste als Standardantwort festlegen

#!/usr/bin/env python 
# coding: utf-8 
#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) 

     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") 

zitiert Voraus für Ihre Hilfe

Antwort

0

Ich fand Lösung, um Schaltfläche in Gtk.dialog zu verwalten. Als ich versuchte zu verstehen, was ist mit verschiedenen Arten von Gtk.ResponseType. Ich entdeckte manchmal, dass es nicht möglich ist, den Knopf zu beeinflussen, wo ich wollte ... .es ist ein kleiner Verdächtiger :-) Tatsächlich fand ich das nach einigem Test. Wenn Sie einen Gtk.dialog erstellen und Gtk.Button separat vorbereiten und Sie add by add_action_widget hinzufügen, ist die Reihenfolge der Button-Erstellung wichtig. Und auch die Art der Antwort. 4 Regeln folgen:

Regel 1: um eine Schaltfläche mit der Aktion wie set_default_response (RESPONSE_ID) haben Sie dies in erster erklären müssen.

Regel 2: Sie können jede Art von Gtk.ResponseType mit einem beliebigen Symbol verwenden. Gtk verlinke es nicht. Trotzdem eine Schaltfläche mit einem Label zu verknüpfen = 'Non OK' und ein Gtk.ResponseType.YES kann seltsam sein !!!! bessere Möglichkeit, eine Kohärenz zwischen Label und Gtk.ResponseType zu halten ....

Regel 3: eine Ausnahme für Gtk.ResponseType.HELP. Die Taste, die mit self.dialog.add_action_widget (bouton_help, Gtk.ResponseType.HELP) gesetzt gleicher firt links, wenn Sie es in der letzten Aktion zu machen, und es wurde Standardantwort gesetzt

Regel N ° 4:, wenn Sie Ich möchte eine Hilfetaste verwenden und eine andere OK-Taste verwenden, um die Standardantwort zuerst normal einzustellen. Danach machen Sie eine Schaltfläche mit so etwas button_help = my_method (label_help, stock_icon = Gtk.STOCK_HELP), wo my_method eine Schaltfläche mit einem Stock-Symbol zum Beispiel Schaltfläche zum Dialogfeld hinzufügen ... .. Self.dialog.add_action_widget (bouton_help, Gtk.ResponseType.NO). Seien Sie vorsichtig eine Gtk.ResponseType.HELP nicht verwenden, sondern Gtk.ResponseType.NO zum Beispiel verwenden

#!/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")