如何从 GType 中获取相关的 Python 类型?

问题描述 投票:0回答:1

我正在使用 Glade 在 Python 中使用 GTK-3 构建 GUI。还有一个 ListStore,其列在 Glade 文件中定义。现在我想用我作为字符串接收的数值(有 int 和 float 列)填充 ListStore,所以我需要根据列类型转换它们。

我想使用 ListStore 对象中定义的列类型进行转换,而不是使用硬编码列表,以便仅维护一次列类型(最好在 Glade 文件中),并使这部分对于其他类似的 ListStore 保持模块化稍后添加。不幸的是,我通过调用

TreeModel.get_column_type(index_)
从 ListStore 中得到的列类型是
GObject.GTypes
,而且我不知道如何使用 GType 创建适当的值或从中获取相关的 Python 类型。

我已经尝试在交互式 Python shell 中使用

gint
类型对象和
GObject.GType
类并阅读在线文档,但一切都没有得到解决我的问题的线索。另外,从
GObject.Value
gint
等字符串创建
"123"
类型的
transform()
gchararray
值到
gint
也不起作用。

如何根据 GType 将字符串转换为正确的数字类型?我想做的事情真的可以实现吗?或者我需要采取不同的方法吗?我可以使用 GType 到 Pyhton 类型的一些静态映射来代替,但如果我只是错过了有关 GType 系统的一些内容,我想了解它。

python gtk3 pygobject
1个回答
0
投票

使用

GObject.type_name()
GObject.type_from_name()
函数更容易从 Python 类型转换为 GType(请参阅:https://lazka.github.io/pgi-docs/GObject-2.0/functions.html)因此,您可以使用在运行时生成的动态生成的字典将 GType 转换为其等效的 Python 类型,如下所示:

from gi.repository import GObject

GTYPE_TO_PYTHON - {
    GObject.type_from_name(GObject.type_name(ptype)): ptype
    for ptype in (int, float, str, bool, object)        
}

def convert_colum_value(text: str, column_type: GObject.GType):
    """
    Convert a text string to an appropriate Python value for a GType.
    If no type found, return the string as is
    
    :param text:  value string
    :param column_type:  GType for the column
    """
    
    py_type = GTYPE_TO_PYTHON.get(column_type, str)
    return py_type(text)
    
© www.soinside.com 2019 - 2024. All rights reserved.