gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:08:33 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com