python - python gtk.Entry 中的 "preedit-changed"事件不起作用

标签 python pygtk gtkentry

我试图让我的 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()

最佳答案

我没有意识到这个信号(我倾向于引用我的硬盘上较旧的 GTK+ 文档),但它似乎并没有像你想象的那样做。

深入研究 Gnome 文档后,我发现“预编辑更改”用于处理使用多个按键输入的字符,例如大多数键盘上的重音字母,以及像 ™ 这样的东西,在 Linux 上使用 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()        

关于python - python gtk.Entry 中的 "preedit-changed"事件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26399614/

相关文章:

python - 使用 python3.6 安装 Tensorflow 失败

python ( Pandas ): recombine groupby statements

python - pygtk 将图像缩放到宽度和高度

gtkentry 焦点行为

c# - textEntry.Text 输出是 Gtk.Entry (单声道)

python - Gtk HeaderBar 不展开子项

python - Django - 使用站点框架进行单元测试

python - 在同一层次结构中的不同类之间使用 Django ORM 语法中的 UNION

python - 折叠空 gtk.CellRenderer

python `YYYY-MM-DD`