Простой, универсальный и многократно используемый диалог ввода (иногда его называют диалог ввода) в PyGTK - PullRequest
5 голосов
/ 28 ноября 2011

Я ищу простой диалог с виджетом для ввода текста, запрашивая у пользователя какой-либо ввод. Диалог должен быть простым для запуска (например, варианты gtk.MessageDialog) и максимально гибким.

Есть, конечно, несколько примеров, но они либо недостаточно гибки, либо слишком сложны для построения на мой вкус.

Я ненавижу заново изобретать колесо ... или диалог.

Ответы [ 3 ]

10 голосов
/ 29 ноября 2011

На основании примера , который я нашел (спасибо 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% случаев использования в любом случае.

4 голосов
/ 28 ноября 2011

Нет ни одного доступного в GTK +. У вас есть два варианта:

  • Создайте диалоговое окно, упакуйте Entry и любой другой контент, который вам нужен (вероятно, наилучший способ, на мой взгляд)
  • Получить content_area MessageDialog и добавить запись к нему.

Что-то вроде:

#!/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 требуется больше уточнений.

3 голосов
/ 18 января 2012

Вот функция, которую я написал, основываясь на предыдущих ответах здесь.Это функция вместо класса, что означает, что вы можете использовать ее в одной строке.

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
...