Помещение Gtk.Label в строку Gtk.TreeView - PullRequest
1 голос
/ 08 мая 2020

Я пытаюсь поместить размеченный текст (потенциально содержащий itali c, полужирный, цвет) в столбец Gtk.TreeView, используя следующий пример:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

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


class CellRendererLabelWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Gtk.Label in Gtk.ListStore Example")


        # Creating the ListStore object
        self.liststore = Gtk.ListStore(str, Gtk.Label)

        # Making the ListStore Model
        label=Gtk.Label()
        label.set_markup("<b>baz</b> foo")
        self.liststore.append(["bar", label])

        treeview = Gtk.TreeView(model=self.liststore)

        # Preparing the first column only plain text
        renderer_text_0 = Gtk.CellRendererText()
        column_text_0 = Gtk.TreeViewColumn("Text", renderer_text_0, text=0)
        treeview.append_column(column_text_0)

        # Preparing the second column with label
        renderer_text_1 = Gtk.CellRendererText()
        column_text_1 = Gtk.TreeViewColumn("Label", renderer_text_1, text=1)
        treeview.append_column(column_text_1)


        self.add(treeview)


win = CellRendererLabelWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

И получаю следующее сообщение об ошибке:

GtkLabelInGtkList.py:43: Warning: unable to set property 'text' of type 'gchararray' from value of type 'GtkLabel'
  win.show_all()
GtkLabelInGtkList.py:44: Warning: unable to set property 'text' of type 'gchararray' from value of type 'GtkLabel'
  Gtk.main()

И следующий рендеринг окна:

First window render image

Как вы видите, строка столбца «Метка» пуста, когда я ожидал чего-то вроде « baz foo».

Как сказано в сообщении об ошибке, Gtk пытается найти свойство text в GtkLabel и не находит его. Итак, я заменяю text на label, чтобы получилась строка, подобная этой column_text_1 = Gtk.TreeViewColumn("Label", renderer_text_1, label=1). Но затем я получаю следующую ошибку:

(GtkLabelInGtkList.py:10013): Gtk-WARNING **: Cannot connect attribute 'label' for cell renderer class 'GtkCellRendererText' since attribute does not exist

Итак, каково решение, чтобы поместить Label (или другие виджеты Gtk) внутри TreeView?

1 Ответ

1 голос
/ 08 мая 2020

Вы не можете размещать виджеты внутри GtkTreeView, только средства визуализации ячеек.

Если вы хотите отображать разметку внутри столбца древовидного представления, вы можете использовать свойство markup из GtkCellRendererText вместо свойства text:

self.liststore = Gtk.ListStore(str, str)
self.liststore.append(["bar", "<b>baz</b> foo"])

# ...

column_text_0 = Gtk.TreeViewColumn("Text", renderer_text_0, text=0)
column_text_1 = Gtk.TreeViewColumn("Markup", renderer_text_1, markup=1)
...