我正在搜索带有文本输入窗口小部件的简单对话框,要求用户输入一些内容。该对话框应该易于运行(如gtk.MessageDialog
变体)和灵活。
当然有一些例子,但它们要么不够灵活,要么太复杂,无法根据自己的口味进行构建。
我讨厌重新发明轮子......或者是对话。
答案 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 +中没有一个可用。你有两个选择:
有些事情:
#!/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