【问题标题】:Simple, versatile and re-usable entry dialog (sometimes referred to as input dialog) in PyGTKPyGTK 中简单、通用且可重用的输入对话框(有时称为输入对话框)
【发布时间】:2011-11-28 01:54:53
【问题描述】:

我正在寻找一个带有文本输入小部件的简单对话框,要求用户输入一些内容。该对话框应该易于运行(如gtk.MessageDialog 变体)并且非常灵活。

当然有一些例子,但它们要么不够灵活,要么太复杂,无法按照我的口味构建。

我讨厌重新发明轮子……或对话。

【问题讨论】:

    标签: python user-interface gtk pygtk


    【解决方案1】:

    基于我找到的example(感谢Ardoris!),我想出了一个对话框子类...希望它对那里的人有所帮助!

    #!/usr/bin/env python
    import gtk
    class EntryDialog(gtk.MessageDialog):
        def __init__(self, *args, **kwargs):
            '''
            Creates a new EntryDialog. Takes all the arguments of the usual
            MessageDialog constructor plus one optional named argument 
            "default_value" to specify the initial contents of the entry.
            '''
            if 'default_value' in kwargs:
                default_value = kwargs['default_value']
                del kwargs['default_value']
            else:
                default_value = ''
            super(EntryDialog, self).__init__(*args, **kwargs)
            entry = gtk.Entry()        
            entry.set_text(str(default_value))
            entry.connect("activate", 
                          lambda ent, dlg, resp: dlg.response(resp), 
                          self, gtk.RESPONSE_OK)
            self.vbox.pack_end(entry, True, True, 0)
            self.vbox.show_all()
            self.entry = entry
        def set_value(self, text):
            self.entry.set_text(text)
        def run(self):
            result = super(EntryDialog, self).run()
            if result == gtk.RESPONSE_OK:
                text = self.entry.get_text()
            else:
                text = None
            return text
    

    如果用户按下<Enter> 或单击确定,run() 方法将返回输入框中输入的文本。如果单击Cancel 或按下<Esc>,则run() 方法返回None

    除此之外,对话框的行为应与任何其他 gtk.MessageDialog 实例一样。

    也许这不是非常通用的,因为它假定您总是可以选择 Ok,但无论如何,这是我在 99% 的用例中需要的。

    【讨论】:

      【解决方案2】:

      在 GTK+ 中没有可用的。你有两个选择:

      • 创建一个对话框,打包条目和您需要的任何其他内容(在我看来可能是最好的方式)
      • 检索 MessageDialog 的 content_area 并向其附加一个条目。

      类似的东西:

      #!/usr/bin/env python
      
      import gtk
      
      messagedialog = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_QUESTION, buttons=gtk.BUTTONS_OK, message_format="Hello")
      
      action_area = messagedialog.get_content_area()
      
      entry = gtk.Entry()
      action_area.pack_start(entry)
      
      messagedialog.show_all()
      messagedialog.run()
      messagedialog.destroy()
      

      虽然它可能需要更多的细化才能让条目很好地显示。

      【讨论】:

        【解决方案3】:

        这是我根据之前的答案编写的函数。它是一个函数而不是一个类,这意味着你可以在一行中使用它。

        def get_text(parent, message, default=''):
            """
            Display a dialog with a text entry.
            Returns the text, or None if canceled.
            """
            d = gtk.MessageDialog(parent,
                                  gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
                                  gtk.MESSAGE_QUESTION,
                                  gtk.BUTTONS_OK_CANCEL,
                                  message)
            entry = gtk.Entry()
            entry.set_text(default)
            entry.show()
            d.vbox.pack_end(entry)
            entry.connect('activate', lambda _: d.response(gtk.RESPONSE_OK))
            d.set_default_response(gtk.RESPONSE_OK)
        
            r = d.run()
            text = entry.get_text().decode('utf8')
            d.destroy()
            if r == gtk.RESPONSE_OK:
                return text
            else:
                return None
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-30
          • 1970-01-01
          • 1970-01-01
          • 2011-12-09
          • 1970-01-01
          相关资源
          最近更新 更多