【发布时间】:2011-11-28 01:54:53
【问题描述】:
我正在寻找一个带有文本输入小部件的简单对话框,要求用户输入一些内容。该对话框应该易于运行(如gtk.MessageDialog 变体)并且非常灵活。
当然有一些例子,但它们要么不够灵活,要么太复杂,无法按照我的口味构建。
我讨厌重新发明轮子……或对话。
【问题讨论】:
标签: python user-interface gtk pygtk
我正在寻找一个带有文本输入小部件的简单对话框,要求用户输入一些内容。该对话框应该易于运行(如gtk.MessageDialog 变体)并且非常灵活。
当然有一些例子,但它们要么不够灵活,要么太复杂,无法按照我的口味构建。
我讨厌重新发明轮子……或对话。
【问题讨论】:
标签: python user-interface gtk pygtk
基于我找到的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% 的用例中需要的。
【讨论】:
在 GTK+ 中没有可用的。你有两个选择:
类似的东西:
#!/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()
虽然它可能需要更多的细化才能让条目很好地显示。
【讨论】:
这是我根据之前的答案编写的函数。它是一个函数而不是一个类,这意味着你可以在一行中使用它。
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
【讨论】: