我试图让我的gtk.Entry只接受数字。起初我尝试在事件发生时在我的stdout中打印一些东西,但是当我运行我的脚本时,当我在gtk.Entry中输入内容时没有发生任何事情(pygtk 2.24,python 2.7.2,Windows XP,我也运行了相同的代码)在Linux中,结果相同)。代码有什么问题?
import gtk
class UI:
def delete_event(self, widget, event, data=None):
return False
def destroy(self, widget, data=None):
gtk.main_quit()
def preedit_changed(self, widget, preedit, data=None):
print "preedit_changed"
return True
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.connect("delete_event", self.delete_event)
self.window.connect("destroy", self.destroy)
self.window.set_border_width(5)
self.entry = gtk.Entry()
self.entry.connect("preedit-changed", self.preedit_changed)
self.window.add(self.entry)
self.window.show_all()
gtk.main()
if __name__ == "__main__":
ui = UI()
答案 0 :(得分:1)
我没有意识到这个信号(我倾向于在我的HD上提到一些较旧的GTK +文档),但看起来它并没有做你认为它做的事情。
在深入研究Gnome文档后,我发现" preedit-changed"用于处理使用多个按键输入的字符,例如大多数键盘上的重音字母,以及类似TM的东西,在Linux上使用Compose键输入:Compose-t-m。因此,如果您在条目框中输入其中一个多键字符, 将获得" preedit_changed"信号。 OTOH,在我的实验中,返回的preedit
总是一个空字符串......
但是你可以用普通的老式"改变"做你想做的事。信号。我已经使用一个仅处理数字的简单示例修改了您的代码,但它也很容易扩展它以应对+-.
;用科学记数法处理数字需要采用不同的技术。
#! /usr/bin/env python
import pygtk
pygtk.require('2.0')
import gtk
class UI:
def delete_event(self, widget, event):
return False
def destroy(self, widget):
gtk.main_quit()
def preedit_changed(self, widget, preedit):
value = widget.get_text()
print "preedit_changed: '%s', preedit: '%s'" % (value, preedit)
return True
def activated(self, widget):
value = widget.get_text()
print "activated: '%s'" % value
return True
def changed(self, widget):
value = widget.get_text()
print "changed: '%s'" % value
return True
def digits_only(self, widget):
value = widget.get_text()
#Remove non-digits from string
value = ''.join([c for c in value if c.isdigit()])
widget.set_text(value)
return True
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.connect("delete_event", self.delete_event)
self.window.connect("destroy", self.destroy)
self.window.set_border_width(5)
self.entry = gtk.Entry()
self.entry.connect("activate", self.activated)
#self.entry.connect("changed", self.changed)
self.entry.connect("changed", self.digits_only)
self.entry.connect("preedit_changed", self.preedit_changed)
self.window.add(self.entry)
self.window.show_all()
gtk.main()
if __name__ == "__main__":
ui = UI()