【问题标题】:"preedit-changed" event in python gtk.Entry does not workpython gtk.Entry 中的“preedit-changed”事件不起作用
【发布时间】:2014-10-16 22:07:57
【问题描述】:

我正在尝试让我的 gtk.Entry 只接受数字。起初我试图在事件发生时在我的标准输出中打印一些东西,但是当我运行我的脚本时,当我在我的 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()

【问题讨论】:

    标签: python pygtk gtkentry


    【解决方案1】:

    我不知道这个信号(我倾向于在我的 HD 上参考一些较旧的 GTK+ 文档),但它似乎并没有像你想象的那样做。

    在研究 Gnome 文档后,我发现“preedit-changed”用于处理使用多个按键输入的字符,例如大多数键盘上的重音字母,以及类似 ™ 之类的东西,在 Linux 上使用 @987654321 输入@键:撰写-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()        
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 2017-11-21
      • 2011-05-13
      相关资源
      最近更新 更多