0

pyGTK(2.22-バージョンは非常に重要です)では、以下に詳述するバグが発生しています。これはpyGTKの問題だと思いますが、私は間違っている可能性があり、バグ以外の報告はしたくありません。

基本的に、私はgtk.Entry()usingからテキストを抽出.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)
4

1 に答える 1

3

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にキャストする必要はないと思います。また、魔法数は悪いです。定数を定義するか、事前定義された定数を使用します。

于 2010-11-08T07:31:20.053 に答える