在pyGTK(2.22 - 版本非常重要)中,我遇到了下面详述的错误。我认为这是一个pyGTK问题,但我可能错了,不想报告非bug。
基本上,我使用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)
答案 0 :(得分:3)
destroy()
会导致窗口小部件及其子窗口无法实现,这意味着该条目会丢失其文本。在销毁之前,请务必阅读对话框(或任何其他小部件)的状态。
您的代码还存在其他一些小问题:
为清楚起见,您应该用简单的循环替换地图:
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)
不要在所有孩子上调用show
,只需在父母上调用show_all
(在这种情况下为对话框)。
我认为你不必将对话结果转换为int。另外,魔术数字很糟糕。定义常量,或使用a predefined one。