我一直在学习使用TreeViews,这两种类型通常用于访问树的特定行.我真的不明白两者之间的区别.我的代码正在工作 - 我根据函数的必需参数在两者之间来回转换 - 但不是基于对原因的真正理解.
这两种类型有什么区别?
我第一次在 GTK 和 Glade 上乱搞,我遇到了一个非常烦人的问题。当我在 TextView 中输入文本时,TextView 会自动调整大小,将其他小部件推开。
这是一个非常烦人的行为。我不希望我的 TextView 根据其中的文本量改变大小。
有谁知道我可以做些什么来防止 TextView 根据其内容调整大小?
我如何真正禁用gtk treeview交互式搜索?该文件说set_enable_search(False),但如果我这样做,CTRL+ F还是引起了一个恼人的搜索弹出出现.连接start-interactive-search和返回True也不起作用.
我希望无论何时选择我的gtk.TreeView更改都会检测到它,以及何时调用具有此信息的函数.到目前为止,我发现这样做的唯一方法是附加所有这些信号:
...
self.sitterView.connect("cursor-changed", self.selectionChanged)
self.sitterView.connect("unselect-all", self.selectionChanged)
self.sitterView.connect("toggle-cursor-row", self.selectionChanged)
self.sitterView.connect("select-all", self.selectionChanged)
...
def selectionChanged(self, treeview):
foo(self.sitterView.get_selection().get_selected())
Run Code Online (Sandbox Code Playgroud)
但是,似乎我从回调中获得的选择是"延迟的".也就是说,它显示上一次回调完成后的选择.例如,如果我经常按CTRL +单击一行,当行从取消选择变为选中时,foo不会被选择,当行从选择变为取消选择时,将给出一个选择.如果我get_selection().get_selected()稍后再打电话,我会得到正确的选择.知道怎么处理这个吗?
我使用带有ListStore的TreeView作为模型.当用户点击一行时,我想采取一些行动但不使用单元格中的值,但使用我创建的行数据......
目前我有TreeView,TreeModel(ListStore)和我自己的数据(我讽刺地称之为模型).
所以问题是:
拥有一个模型 - 我想要显示的数据的对象表示并填充ListStore以显示在TreeView中的数据是否"正确",或者更好地实现自己的TreeModel版本(包装我的数据) model)显示数据?
并且:
如果有人双击一行,我可以获得RowActivated事件(使用C#/ Gtk#),该事件提供激活行的路径.有了它我可以得到一个TreeIter并使用它我可以得到一个单元格的值.但是,首先要找到构造行的数据对象的最佳实践是什么?\(不知何故,这个问题让我想到了第一个 - 通过思考如果我试图实现自己的数据对象会更容易TreeModel的...)
当用户右键单击树视图行时,如何执行某些操作?
可以使用gtk.TreeViewColumn.set_resizable(True)手动调整列的大小...除了最后一列 - 它总是占用可用空间.
虽然在大多数情况下它是明智的,但我使用TreeView-in-a-ScrolledView,我希望能够缩小/扩展最后一列.
目前我使用以下kludge:
def add_dummy_column(treeview):
def put_dummy_last(treeview, dummy):
columns = treeview.get_columns()
last = next(reversed(columns), None)
if not last or last == dummy:
return
if dummy in columns:
treeview.move_column_after(dummy, last)
else:
treeview.append_column(dummy)
dummy = gtk.TreeViewColumn()
dummy.set_min_width(1)
dummy.set_fixed_width(1)
dummy.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
dummy.set_resizable(False)
dummy.set_expand(False)
treeview.connect('columns-changed', put_dummy_last, dummy)
return dummy
Run Code Online (Sandbox Code Playgroud)
但是,这个虚拟列往往会妨碍:使TreeView列循环复杂化等等.是否有更好/更优雅的解决方案?
更新:它确实有效
在尝试打造一个最小的例子时,我发现它没有我的kludge工作正常.这是没有gtk.ScrolledWindow的最小示例:
import gtk
window = gtk.Window()
window.connect('destroy', lambda *args: gtk.main_quit())
vbox = gtk.VBox()
window.add(vbox)
table = gtk.TreeView(gtk.ListStore(str, str, str))
for i in range(3):
column = gtk.TreeViewColumn('Column {}'.format(1 + i))
column.set_resizable(True) …Run Code Online (Sandbox Code Playgroud) 我正在尝试更改树视图的交替背景颜色.我知道这应该通常留给主题,但我想覆盖以测试gtk Style功能.根据这里的treeview文档,我了解到TreeView有几个只读样式选项,包括"偶数行颜色","奇数行颜色"和"允许规则"(根据文档) ,允许绘制偶数和奇数行颜色).我知道为了覆盖那些只读设置,我必须改变gtkrc风格的文件或字符串中的样式.
所以我的树视图字符串看起来像:
gtk.rc_parse_string( """
style "custom-treestyle"{
GtkTreeView::odd-row-color = "#00CBFF"
GtkTreeView::even-row-color = "#90EE90"
GtkTreeView::allow-rules = 1
}
widget "*custom_treeview*" style "custom-treestyle"
""")
treeview.set_name("custom_treeview" )
Run Code Online (Sandbox Code Playgroud)
这解析没有错误,结果是偶数行颜色应用于偶数行和奇数行.
编辑:我从一些更多的测试中发现,我的解析字符串必须从其他一些样式设置中被覆盖.
print treeview.style_get_property( 'allow-rules' )
print treeview.style_get_property( 'odd-row-color')
print treeview.style_get_property( 'even-row-color')
Run Code Online (Sandbox Code Playgroud)
给出结果:
True
None
None
Run Code Online (Sandbox Code Playgroud)
这些都是默认设置.通常我会认为它根本不解析字符串并设置适当的值,但在这种情况下,背景颜色确实会改变为我指定的颜色(只有它将每一行的背景绘制为一种颜色).
我究竟做错了什么?
我要做的是动态更改(通过过滤器)字符串列表.在我的例子中,它是存储路径的文件列表gtk.TreeStore.
预期效果的示例(例如,Sublime Text 2文件搜索Ctrl+ P):
数据:
文件列表(treeview):
操作:在过滤器字段(Entry小部件)中,用户开始键入.在第一个字符后例如.'t'列表应该像这样更新:
结果:
文件列表(treeview):
我已经拥有的东西:
self.search_entry = gtk.Entry()
self.tree_store = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_BOOLEAN)
for node, files in self.files_list:
parent = self.tree_store.append(None, [node, True])
for f in files:
self.tree_store.append(parent, [f, True])
tree_filter = self.tree_store.filter_new()
self.treeview = gtk.TreeView(tree_filter)
self.renderer0 = gtk.CellRendererText()
self.treeview.insert_column_with_attributes(-1, "Filename", self.renderer0, text=0)
self.treeview.set_search_column(0)
self.treeview.set_search_entry(self.search_entry)
self.treeview.expand_all()
Run Code Online (Sandbox Code Playgroud)
我知道TreeView有一个方法set_search_equal_func可以将默认匹配函数更改为我自己的.问题是如何在过滤器表单字段中键入时更改列表?
我想将subprocess模块从py v3.3 导入到v2.7,以便能够使用该timeout功能。
看了几篇文章后,我尝试了
from __future__ import subprocess
Run Code Online (Sandbox Code Playgroud)
但它说:
SyntaxError: future feature subprocess is not defined
Run Code Online (Sandbox Code Playgroud)
然后我发现未来没有任何功能subprocess。
那么我应该subprocess从哪里导入v3.3?
gtktreeview ×8
gtk ×6
pygtk ×6
python ×6
gtk# ×2
c ×1
c# ×1
click ×1
filtering ×1
future ×1
gtktextview ×1
mono ×1
python-2.7 ×1
python-3.x ×1
right-click ×1
treeviewitem ×1