如何在Gtk.Dialog

时间:2016-04-24 18:35:52

标签: python-2.7 dialog gtk3

我讨论任何想法来解决我的问题

请参阅以下代码。 这是一个解释内容的演示 实际上我需要使用add_action_widget添加按钮以添加带图像的按钮。如果我混合add_action_widget和add_button小部件不是相同的垂直大小而且很难看。

我只想使用add_action_widget并能够将有效按钮设置为默认响应

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

提前感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,以便管理Gtk.dialog中的按钮。 当我试图了解不同类型的Gtk.ResponseType时的情况。我发现有时候不可能影响我想要的按钮...。的小嫌疑人:-) 事实上经过一些测试我发现了这一点。当你制作一个Gtk.dialog并且你单独准备Gtk.Button并且你通过add_action_widget添加它时,按钮的制作顺序很重要。还有响应的类型。 遵循4条规则:

规则1:为了拥有一个像set_default_response(response_id)这样的动作的按钮,你必须先声明这个。

规则2:您可以将任何类型的Gtk.ResponseType与任何股票图标一起使用。 Gtk没有链接它。然而,链接一个带有标签的按钮='不行'和一个Gtk.ResponseType.YES可能很奇怪!!!!更好的方法是保持标签和Gtk.ResponseType之间的一致性......

规则3: Gtk.ResponseType.HELP的例外情况。使用self.dialog.add_action_widget(bouton_help,Gtk.ResponseType.HELP)创建的按钮如果在最后一个操作中设置它并且设置为默认响应,则设置为相同的

规则N°4:如果您想使用帮助按钮并保持其他OK按钮设置默认响应,     首先正常。之后,制作一个类似的按钮 button_help = my_method(label_help,stock_icon = Gtk.STOCK_HELP),其中my_method正在制作一个带有股票图标的按钮,例如 在对话框中添加按钮...... self.dialog.add_action_widget(bouton_help,Gtk.ResponseType.NO)。 小心不要使用Gtk.ResponseType.HELP,但要使用Gtk.ResponseType.NO ,例如

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