pyGTK - gtk.Entry в gtk.Dialog не дает текста - PullRequest
0 голосов
/ 08 ноября 2010

В pyGTK (версия 2.22 - очень важна ) я сталкиваюсь с ошибкой, описанной ниже.Я думаю это проблема pyGTK, но я могу ошибаться и не хочу сообщать об отсутствии ошибок.

В основном я извлекаю текст из gtk.Entry(), используя .get_text(), и это возвращает пустую строку даже с текстом в виджете.Вот некоторый соответствующий код (с определениями NOOP, чтобы сделать его работоспособным):

import gtk

class Item: pass

def tofile(item): pass

# Described issues begin below

class ItemAddDialog:
    "A dialog used when adding a menu item"
    def __init__(self):
        self.dialog = gtk.Dialog(title="Adding menu item...", buttons=btns)
        self.fname, self.name, self.icon, self.exe, self.cats = [gtk.Entry() for i in range(5)]
        self.obs = (self.fname, self.name, self.icon, self.exe, self.cats)
        self._config()

    def _config(self):
        _ = self.dialog.vbox
        map(lambda x: _.pack_start(x, False, False, 0), self.obs)
        map(lambda x: x.show(), self.obs)
        map(lambda x: x[1].set_text(x[0]), zip(("Filename", "Name in Menu", "Icon", "Command", "Categories (; Delimited)"), self.obs))

    def run(self):
        r = self.dialog.run()
        self.dialog.destroy()
        print _quote(str(r))
        if (int(r) == 1): i = Item(self.fname.get_text(), self.name.get_text(), self.icon.get_text(), self.exe.get_text(), self.cats.get_text())
        print str(i)
        tofile(i)

1 Ответ

3 голосов
/ 08 ноября 2010

destroy() среди прочего приведет к тому, что виджет и его дочерние элементы будут не реализованы, что означает, что запись теряет свой текст. Всегда читайте состояние диалога (или любого другого виджета), прежде чем уничтожать его.

Есть некоторые другие незначительные проблемы с вашим кодом:

  1. Для ясности следует заменить карты на простые петли:

    map(lambda x: _.pack_start(x, False, False, 0), self.obs)

    for x in self.obs: _.pack_start(x, False, False)

    map(lambda x: x[1].set_text(x[0]), zip(("Filename", "Name in Menu", "Icon", "Command", "Categories (; Delimited)"), self.obs))

    for txt, x in zip(("Filename", "Name in Menu", "Icon", "Command", "Categories (; Delimited)"), self.obs)): x.set_text(txt)

  2. Вместо вызова show для всех дочерних элементов, просто вызовите show_all для родителя (в данном случае диалоговое окно).

  3. Я не думаю, что вы должны приводить результат диалога к int. Также магические числа плохие. Определите константу или используйте предварительно определенную .

...