如何同时对2个对象进行焦点突出显示

时间:2014-09-15 02:32:48

标签: python treeview openerp pygtk

我希望下面的两个视图都是蓝色的,如何设置呢?请帮我!当我forcus到第二行我想要它突出显示对象都是蓝色,而不是一个蓝色和一个灰色如下。 像这样的代码:

ui = twin_gtk_builder('twin.ui', ['dia_support', 'liststore7'])
win = ui.get_object('dia_support')
##### Begin function tree view
liststore = gtk.ListStore(int, int, int)
liststore.append([1,2,3])
liststore.append([2,2,2])
liststore.append([4,4,4])
win.sw = gtk.ScrolledWindow()
win.sm = gtk.TreeModelSort(liststore)
##### Set sort column
n = 1
win.sm.set_sort_column_id(n, gtk.SORT_ASCENDING)
win.tv = gtk.TreeView(win.sm)
win.vbox.pack_start(win.sw)
win.sw.add(win.tv)
win.tv.column = [None] * 3
win.tv.column[0] = gtk.TreeViewColumn('0-1000')
win.tv.column[1] = gtk.TreeViewColumn('0-1000000')
win.tv.column[2] = gtk.TreeViewColumn('-10000-10000')
win.tv.cell = [None] * 3
for i in range(3):
    win.tv.cell[i] = gtk.CellRendererText()
    win.tv.append_column(win.tv.column[i])
    win.tv.column[i].set_sort_column_id(i)
    win.tv.column[i].pack_start(win.tv.cell[i], True)
    win.tv.column[i].set_attributes(win.tv.cell[i], text=i)   

##### End function tree view
win.show_all()

及其运作方式

enter image description here

再次尝试@PM 2Ring帮助,非常感谢您的帮助!

有人这样做,但我找不到他的联系......

enter image description here

1 个答案:

答案 0 :(得分:1)

我必须做一些工作才能让代码运行,Sunshine jp。将来,尝试发布其他人可以运行的代码&测试,尤其是它的GUI代码。否则,非常很难弄清楚问题是什么以及如何解决它。

我不熟悉twin_gtk1_builder()。它是GTK1功能吗?

无论如何,我已修改您的代码以在GTK2 +上运行。我不太确定您希望代码执行什么操作。所以我给第2行一个青色的背景色。此外,我还添加了进行多项选择的功能,当您使用鼠标选择时,可以使用键盘上的Ctrl或Shift;您还可以使用带有上下箭头的键盘进行多项选择。

当窗口失去焦点时,所选行在我的系统上保持蓝色。也许这是GTK1没有GTK2的特征。 (或者也许是因为我的窗口管理员 - 我在Mepis Linux上使用KDE 4.5.3。)

#!/usr/bin/env python

'''
TreeView test

From http://stackoverflow.com/questions/25840091/how-to-make-forcus-highlight-for-2-objects-at-the-same-time
'''

import pygtk
#pygtk.require('2.0')
import gtk


def TreeViewTest():
    def delete_event(widget, event, data=None):
        gtk.main_quit()
        return False

    win = gtk.Window(gtk.WINDOW_TOPLEVEL)
    win.set_title("TreeView Test")
    win.set_size_request(320, 160)
    win.connect("delete_event", delete_event)

    win.vbox = gtk.VBox()
    win.add(win.vbox)

    win.sw = gtk.ScrolledWindow()
    win.vbox.pack_start(win.sw)

    ##### Begin function tree view

    #Set up liststore data. Column 3 controls whether
    # background color of the TreeView is default or special.
    liststore = gtk.ListStore(int, int, int, bool)
    liststore.append([1, 2, 3, False])
    #Tell row 2 to use the special color 
    liststore.append([2, 2, 2, True])
    liststore.append([4, 4, 4, False])

    win.sm = gtk.TreeModelSort(liststore)

    ##### Set initial sort column
    n = 1
    win.sm.set_sort_column_id(n, gtk.SORT_ASCENDING)
    win.tv = gtk.TreeView(win.sm)
    win.sw.add(win.tv)

    win.tv.column = [None] * 3
    win.tv.column[0] = gtk.TreeViewColumn('0-1000')
    win.tv.column[1] = gtk.TreeViewColumn('0-1000000')
    win.tv.column[2] = gtk.TreeViewColumn('-10000-10000')

    #Set up cell renderers
    win.tv.cell = [None] * 3
    for i in range(3):
        win.tv.cell[i] = gtk.CellRendererText()
        win.tv.cell[i].set_property('cell-background', 'cyan')
        win.tv.append_column(win.tv.column[i])
        win.tv.column[i].set_sort_column_id(i)
        win.tv.column[i].pack_start(win.tv.cell[i], True)
        #win.tv.column[i].set_attributes(win.tv.cell[i], text=i)
        win.tv.column[i].set_attributes(win.tv.cell[i], text=i, 
            cell_background_set=3)

    #Allow multiple selection
    treeselection = win.tv.get_selection()
    treeselection.set_mode(gtk.SELECTION_MULTIPLE)

    ##### End function tree view

    win.show_all()

def main():
    TreeViewTest()
    gtk.main()

if __name__ == "__main__":
    main()

请注意,这是 NOT 制作GUI的好方法。您应该创建一个合适的类,而不是将所有内容作为属性添加到win。有关大量代码示例,请参阅PyGTK 2.0 Tutorial


修改

确定。对于我之前对你的问题的困惑感到抱歉。至少我们现在得到了一个创建TreeView的PyGTK程序的简单示例。 :)

无论如何,当我猜到当窗口失去焦点在你的计算机上时,选择的蓝色变成灰色是由于窗口管理器的行为,我是对的。我想可能有办法在应用程序中阻止它,通过玩Widget属性,但我不知道该怎么做。此外,如果程序忽略了用户的设置而被认为是粗鲁的。窗口主题。

因此,解决问题的最佳方法是在窗口管理器的外观设置中进行适当的更改。

在KDE中,相关属性被称为"非活动选择会更改颜色",如Color Scheme Options中所述:

  

非活动选择更改颜色 - 如果选中,则使用不同颜色绘制没有输入焦点的元素中的当前选择。这有助于在某些应用程序中以输入焦点对元素进行视觉识别,尤其是那些同时显示多个列表的应用程序。

要更改此设置,请打开系统设置(ALT + F2 - >"系统设置"或[K]菜单 - >系统设置),然后转到"应用程序外观&# 34;并选择" Colors"。在"选项"选项卡,取消选中"非活动选择更改颜色"设置,然后单击“应用”。

...... ......

如果你不使用KDE,你必须自己弄清楚如何改变它;希望其他窗口管理器设置接口和文档引用具有相同名称或类似名称的此属性。