PyGTK GtkTextBuffer.get_iter_at_line(line_number) return ResultTuple in GTK4
When migrating my app to GTK4, I got the error:
TypeError: argument start: Expected Gtk.TextIter, but got __main__._ResultTuple"
I noticed that in the GTK4 docs, the return type is documented. However the GTK3 docs don't document it. There's probably been a slight change.
- https://docs.gtk.org/gtk3/method.TextBuffer.get_iter_at_line.html
- https://docs.gtk.org/gtk4/method.TextBuffer.get_iter_at_line.html
GtkTextBuffer.get_iter_at_line_offset(line_number, char_offset)
is also returning a ResultTuple
. I don't see any changes in the doc however.
- https://docs.gtk.org/gtk3/method.TextBuffer.get_iter_at_line_offset.html
- https://docs.gtk.org/gtk4/method.TextBuffer.get_iter_at_line_offset.html
Example:
import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk
class App(Gtk.Application):
def __init__(self):
super().__init__(application_id='com.example.GtkApplication')
self.connect('activate', self.onActivate)
def onActivate(self, app):
textView = Gtk.TextView()
buf = textView.get_buffer()
buf.set_text('Line01\nLine02\nLine03')
print('get_iter_at_line', buf.get_iter_at_line(1))
print('get_iter_at_line_offset', buf.get_iter_at_line_offset(2, 3))
window = Gtk.ApplicationWindow(application=app)
window.set_title('Gtk4 Test')
window.set_default_size(600, 400)
window.set_child(textView)
window.present()
import sys
app = App()
exitCode = app.run(sys.argv)
sys.exit(exitCode)
get_iter_at_line (True, iter=<Gtk.TextIter object at 0x7fd2eb170220 (GtkTextIter at 0x558bd8ae02d0)>)
get_iter_at_line_offset (True, iter=<Gtk.TextIter object at 0x7fd2eb170220 (GtkTextIter at 0x558bd8b52280)>)
Temporary workaround:
def GtkTextBuffer_parseTextIter(obj):
if isinstance(obj, Gtk.TextIter):
return obj
elif isinstance(obj, tuple) and len(obj) == 2:
result, textIter = obj
if isinstance(textIter, Gtk.TextIter):
return textIter
raise NotImplemented()
def GtkTextBuffer_get_iter_at_line(buf, line_number):
line_iter = buf.get_iter_at_line(line_number)
return GtkTextBuffer_parseTextIter(line_iter)
def GtkTextBuffer_get_iter_at_line_offset(buf, line_number, char_offset):
line_iter = buf.get_iter_at_line_offset(line_number, char_offset)
return GtkTextBuffer_parseTextIter(line_iter)
GtkTextBuffer_get_iter_at_line <Gtk.TextIter object at 0x7fd2eb170220 (GtkTextIter at 0x558bd8b52320)>
GtkTextBuffer_get_iter_at_line_offset <Gtk.TextIter object at 0x7fd2eb170220 (GtkTextIter at 0x558bd8b52320)>