我正在使用 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 系统的一些内容,我想了解它。
使用
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)