Изменение цвета выбранного элемента в GtkTreeview с помощью python

у меня есть диалог, который содержит pygtk.treeview для перечисления задач по приоритету. Каждая строка имеет набор цветов фона на основе этого приоритета, поэтому, например, наивысший приоритет имеет светло-красный фон.

цвет выбора строки не так легко изменить. Я могу установить его с помощью treeview.modify_base(gtk.STATE_SELECTED, "#C4C4C4"), но никакие цвета не работают хорошо с цветами используемыми для увеличения концепции приоритета.

у меня была идея изменить цвет выбора, чтобы быть немного более темной версией цвет используется в качестве обычного фона строки, поэтому в приведенном выше примере это будет темно-красный. Я попытался вызвать функцию выше в ответ на treeselection в changed сигнал, и он работает, но с тяжелым мерцание.

другая идея состояла в том, чтобы изменить выбор на прозрачный и поставить вокруг него границу, но, насколько я могу судить, это невозможно.

  1. как я могу изменить цвет выбора таким образом, как описано выше, без мерцание?
  2. могу ли я изменить отображение выбора, имея только границу вокруг строки?

примечание: Я знаю, что это нарушает тему, выбранную пользователем. У меня для этого есть веская причина. Имея приоритет обозначается цвет делает его узнаваемым. Цвет выделения скрывает это. Если у вас есть альтернативные предложения, я открыт для них, но он должен сохранять легкость, с которой пользователь может определить приоритет.

4 ответов


вы можете добавить отдельную ячейку pixbuf (скажем, тот же размер, что и маленький значок) в крайнем левом углу, чтобы указать выбор. Выбранные строки могут заполнить это более "твердой" (насыщенной) версией цвета, используемого для фона. Например. если вы используете розовый фон для высокого приоритета, вы можете использовать красный для индикатора выбора. Или вы можете использовать значок.

чтобы реализовать это с помощью метода цветной заливки:

  1. отключить встроенную подсветку как по предложению Тобиаса ("сделайте цвет STATE_SELECTED идентичным STATE_NORMAL").
  2. Создать виджет на основе gtk.gdk.Pixbuf это позволяет вам создать сплошную область цвета, возможно, используя fill метод.
  3. использовать CellRendererPixbuf для "отбора" клеток.

Вы можете тут цвет или uncolour "выбор ячейки" на выбор изменяется, чтобы указать, какие строки выбраны, или отображать значок (напр. биржевой символ.)

обратите внимание, что я не реализовал это, это просто идея. Он значительно отличается от обычного указания выбора GTK, поэтому (очевидно) используйте свое суждение о том, можно ли его использовать.


вы можете использовать метод, описанный здесь - Я проверил его кратко, и он делает работу без мерцания. В принципе, трюк заключается в использовании свойства "разметка" визуализатора ячеек. Однако есть одна загвоздка: если вы хотите изменить фон цвет с помощью этого метода изменяется только фон за "фактическим" текстом, а не вся строка. Однако, если вы хотите изменить текст цвет (с

У меня есть следующий CellDataFunc (это C#, но я надеюсь, что он все еще полезен):

private void CellDataFunc(Gtk.TreeViewColumn column, Gtk.CellRenderer cell, Gtk.TreeModel model, Gtk.TreeIter iter) {
    Item item = (Item) model.GetValue (iter, 0);
    if(cell is CellRendererText) {
        int id = (int)column.GetData("colId");
        string text = "";
        switch(id) {
            case 0: text = item.Name;  break;
            case 1: text = item.Size; break;
            case 2: text = item.Time.ToString();  break;                
        }
        //(cell as Gtk.CellRendererText).Text = text;
        if(item.Highlight) {
            (cell as Gtk.CellRendererText).Markup = 
                            "<span background=\"red\">"+text+"</span>";
        } else {
            (cell as Gtk.CellRendererText).Markup = text;
        }
    }
}


Не уверен, что вы подразумеваете под мерцание. Граница потребует подкласса TreeView.

Я бы сделал цвет STATE_SELECTED идентичным STATE_NORMAL, чтобы отключить встроенную подсветку. Затем установите data_func для каждого столбца и измените цвет на визуализаторе ячеек в зависимости от того, находится ли он в выделении или нет.

вы, вероятно, уже делаете это для своего приоритета, поэтому просто умножьте цвет на что-то, чтобы выделить строку.


вопрос устарел, но возможно для кого-то еще, чтобы быть полезным... Для полного отключения выделения и создания эффекта наведения в дереве: 1. Отключить выбор системы в дереве:

  _treeView.Selection.Mode = SelectionMode.None;
  1. обрабатывать событие MotionNotifyEvent:

    [ConnectBefore]
    private void TreeViewOnMotionNotifyEvent(object o, MotionNotifyEventArgs args)
    {
        TreePath treePath;
        TreeIter iter;
    
        int x = Convert.ToInt32(args.Event.X);
        int y = Convert.ToInt32(args.Event.Y);
    
        _treeView.GetPathAtPos(x, y, out treePath);
        _treeView.Model.GetIter(out iter, treePath);
    
        BindObject fieldModel = CellUtil.GetModelValue(_treeView.Model, iter, 1) as BindObject;
    
        HoverLine = _vievModel.BindObjectCollection.IndexOf(fieldModel);
    }
    
  2. в методе SetCellDataFunc:

    BindObject fieldModel = CellUtil.GetModelValue(treeModel, iter, 1) as BindObject;
    int rowCount = _vievModel.BindObjectCollection.IndexOf(fieldModel);
    
    if (HoverLine == rowCount)
    {
            cellRenderer.CellBackgroundGdk = ThemeUtility.GdkOddSelectionColor; //Your selection color
    }
    else
    {
            cellRenderer.CellBackgroundGdk = ThemeUtility.SystemSelectionColor; //Your system selection color
    }
    ...