来自Gtk的插入文本信号上的Gtk 3位置属性。条目始终为0

来自Gtk的插入文本信号上的Gtk 3位置属性。条目始终为0,第1张

来自Gtk的插入文本信号上的Gtk 3位置属性。条目始终为0

“插入文本”的处理程序应更新position参数中接收到的值(我们已经看错了),以反映将来应插入文本的位置并返回它。这一点很重要,因此在信号处理程序返回后将光标更改到正确的位置(这是通过完成的

gtk
)。如果您不更新并返回,则光标将保持在位置0。

在遵循使用

entry.get_position()
以获得正确位置值的建议之后,我发现忽略了处理程序中位置的更新和返回
pygobject
。表现得好像我什么也不返回(光标停留在位置0)。设置处理程序内部的位置无济于事,因为
gtk
在处理程序返回后会将其再次更改回0。

经过一些进一步的调查,我了解到问题在于输入/输出参数的处理

pygobject
在大多数情况下都可以正常工作,但不适用于信号(请参见错误644927)

如果使用connect将处理程序附加到信号上,并且信号具有in /
out参数,则您可能不会在处理程序中收到期望的结果,即使您返回一个值,该值也可能不会被正确处理

pygobject
。任何依赖于该值的东西都可能无法按预期工作(例如,将光标移至新位置)

不过,有一个解决方案是重写关联的vfunc(默认处理程序),而不是使用进行连接

connect()
。此解决方案意味着派生自基类,但它确实有效。

您可以使用此方法在上进行输入验证/转换

Gtk.Entry
。处理我的用例的示例是:

import reimport gigi.require_version('Gtk', '3.0')from gi.repository import Gtkclass MyEntry(Gtk.Entry, Gtk.Editable):    def __init__(self):        super(MyEntry, self).__init__()    def do_insert_text(self, new_text, length, position):        regexp = re.compile('^(d*.?d*)$')        if new_text == '.' and '.' in self.get_text(): return position        elif regexp.match(new_text) is not None: self.get_buffer().insert_text(position, new_text, length) return position + length        return positionentry = MyEntry()window = Gtk.Window()window.connect("destroy", lambda q: Gtk.main_quit())window.add(entry)window.show_all()Gtk.main()

在这种情况下,可以正确接收位置参数,并且pygobject可以看到并使用返回值,因此可以正确定位光标。

重要说明
除了Gtk.Entry,您还必须继承自Gtk.Editable。如果您不这样做,您将开始看到验证或您在

do_insert_text
应用程序中对其他
Gtk.Entry
应用程序所做的任何内部 *** 作。如果不继承,则将覆盖Gtk.Editable提供的基本实现,该实现由
Gtk.Entry
应用程序中的所有其他小部件调用。通过从Gtk.Editable继承,您仅覆盖基本实现的
“本地” 副本,该副本仅适用于您的自定义类。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5648400.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存