OverflowError: With Python 3 Gtk.ListStore only accepts 32 Bit Integers.

Bug #1866625 reported by Wolf Pichler
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
pygobject (Ubuntu)
New
Low
Unassigned

Bug Description

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

This works in Python 2:

mystore = Gtk.ListStore(long)
mystore.insert_with_valuesv(-1, [1], [long(1330400507426)])

This does not work in Python 3:

mystore = Gtk.ListStore(int)
mystore.insert_with_valuesv(-1, [1], [int(1330400507426)])

OverflowError: Item 0: out of range for int property

----

lsb_release -rd
Description: Ubuntu 18.04.4 LTS
Release: 18.04

apt-cache policy python3-gi
python3-gi:
  Installed: 3.26.1-2ubuntu1
  Candidate: 3.26.1-2ubuntu1
  Version table:
 *** 3.26.1-2ubuntu1 500
        500 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages
        100 /var/lib/dpkg/status
     3.26.1-2 500
        500 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages

python3 -V
Python 3.6.9

Revision history for this message
Sebastien Bacher (seb128) wrote :

Thank you for your bug report, that seems similar to https://gitlab.gnome.org/GNOME/pygobject/issues/198

Changed in pygobject (Ubuntu):
importance: Undecided → Low
Revision history for this message
Wolf Pichler (w-pichler) wrote : Re: [Bug 1866625] Re: OverflowError: With Python 3 Gtk.ListStore only accepts 32 Bit Integers.

I'm not sure what exactly they are really talking about at
https://gitlab.gnome.org/GNOME/pygobject/issues/198.

My FR concerns 3.26.1-2ubuntu1 and at gitlab it is stated "I think it
used to work in 3.26." which

clearly is not the case.

I took a look into the source and in pygi-value.c I found this:

case G_TYPE_INT:
    {
        glong val = PYGLIB_PyLong_AsLong(obj);
        if (val == -1 && PyErr_Occurred ())
            return -1;
        if (val > G_MAXINT || val < G_MININT) {
            PyErr_SetString(PyExc_OverflowError, "out of range for int
property");
            return -1;
        }
        g_value_set_int(value, (gint)val);
        break;
    }

and a lot of comments like this:

#if PY_VERSION_HEX < 0x03000000

[snip]

#endif

To me this means that somebody is/was aware of the fact that some more
work has to be done for

making this stuff compatible to Python 3.

On 09.03.20 14:48, Sebastien Bacher wrote:
> Thank you for your bug report, that seems similar to
> https://gitlab.gnome.org/GNOME/pygobject/issues/198
>
> ** Bug watch added: gitlab.gnome.org/GNOME/pygobject/issues #198
> https://gitlab.gnome.org/GNOME/pygobject/issues/198
>
> ** Changed in: pygobject (Ubuntu)
> Importance: Undecided => Low
>

Revision history for this message
Sebastien Bacher (seb128) wrote :

COuld you test the upstream workaround and use GObject.Value(GObject.TYPE_UINT64, 1330400507426) ?

Revision history for this message
Wolf Pichler (w-pichler) wrote :

It works!

On 09.03.20 21:17, Sebastien Bacher wrote:
> COuld you test the upstream workaround and use
> GObject.Value(GObject.TYPE_UINT64, 1330400507426) ?
>

Revision history for this message
Christoph Reiter (lazka) wrote :

"int" maps to the same underlying type in Python 2 and Python 3. This wasn't changed when pygobject was ported to Python 3 and can't really be changed now. If you want be sure your numbers fit use the suggested "GObject.TYPE_*", or just use "object" which means the Python int object is stored as is, assuming you don't need to access it in C code somewhere else.

Revision history for this message
Wolf Pichler (w-pichler) wrote :

It should indeed be done like this:

 import gi
 gi.require_version('Gtk', '3.0')
 from gi.repository import Gtk

 from gi.repository import GObject

 mystore = Gtk.ListStore(GObject.TYPE_UINT64)
 mystore.insert_with_valuesv(-1, [1], [GObject.Value(GObject.TYPE_UINT64, 1330400507426)])

###

I was completely unaware of that possibility because the source of my GTK knowlege is

https://lazka.github.io/pgi-docs/#Gtk-3.0/classes/ListStore.html#Gtk.ListStore.set_column_types

When checking out the available types one ends up here:

https://lazka.github.io/pgi-docs/#GObject-2.0/classes/GType.html#GObject.GType

Which does not ring any bell ...

So I did it like in

https://python-gtk-3-tutorial.readthedocs.io/en/latest/treeview.html#the-model

where the Python types are used.

###

With the knowlege I gained through this FR it was possible to find this:

GObject Built-in Type Constants
The Built-in Type constants specify the pre-defined types used by gobject.

https://developer.gnome.org/pygobject/stable/gobject-constants.html#gobject-type-constants

which is quite useful.

###

Thanks!

On 11.03.20 17:56, Christoph Reiter wrote:
> import gi
> gi.require_version('Gtk', '3.0')
> from gi.repository import Gtk
>
> This works in Python 2:
>
> mystore = Gtk.ListStore(long)
> mystore.insert_with_valuesv(-1, [1], [long(1330400507426)])
>
> This does not work in Python 3:
>
> mystore = Gtk.ListStore(int)
> mystore.insert_with_valuesv(-1, [1], [int(1330400507426)])

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.