PyGTK中简单,通用且可重复使用的输入对话框(有时称为输入对话框)

时间:2011-11-28 01:54:54

标签: python user-interface gtk pygtk

我正在搜索带有文本输入窗口小部件的简单对话框,要求用户输入一些内容。该对话框应该易于运行(如gtk.MessageDialog变体)和灵活。

当然有一些例子,但它们要么不够灵活,要么太复杂,无法根据自己的口味进行构建。

我讨厌重新发明轮子......或者是对话。

3 个答案:

答案 0 :(得分:10)

基于我发现的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

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

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

也许这不是非常一般,因为它假设你总是选择Ok,但这仍然是我在99%的用例中所需要的。

答案 1 :(得分:4)

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

虽然它可能需要更多细化才能让Entry显示得很好。

答案 2 :(得分: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