更高级别的Python GUI工具包,例如用于TreeView/Grid的pass dict
使用PyGTK启动了我的第一个Python宠物项目。虽然这是一个非常强大的GUI工具包,看起来非常棒,但我还是有些恼火。所以我考虑过渡到其他方面,因为它还不太广泛。在和上四处查看了一下,但没有得到很好的概述 PyGTK的优点是:更高级别的Python GUI工具包,例如用于TreeView/Grid的pass dict,python,user-interface,gtk,pygtk,Python,User Interface,Gtk,Pygtk,使用PyGTK启动了我的第一个Python宠物项目。虽然这是一个非常强大的GUI工具包,看起来非常棒,但我还是有些恼火。所以我考虑过渡到其他方面,因为它还不太广泛。在和上四处查看了一下,但没有得到很好的概述 PyGTK的优点是: 林间空地档案 自信号自动连接({…}) self.get_widget()作为u_getattr__ 然而,这让我感到烦恼: 手动gobject.idle_add(lambda:…和False) 没有保存应用程序/窗口状态的标准功能 TreeView需要构建阵列
- 林间空地档案
- 自信号自动连接({…})
- self.get_widget()作为u_getattr__
- 手动gobject.idle_add(lambda:…和False)
- 没有保存应用程序/窗口状态的标准功能
- TreeView需要构建阵列
- widget.get_selection().get_selected(),model.get_value(iter,liststore_索引)
#-- fill a treeview
#
# Adds treeviewcolumns/cellrenderers and liststore from a data dictionary.
# Its datamap and the table contents can be supplied in one or two steps.
# When new data gets applied, the columns aren't recreated.
#
# The columns are created according to the datamap, which describes cell
# mapping and layout. Columns can have multiple cellrenderers, but usually
# there is a direct mapping to a data source key from entries.
#
# datamap = [ # title width dict-key type, renderer, attrs
# ["Name", 150, ["titlerow", str, "text", {} ] ],
# [False, 0, ["interndat", int, None, {} ] ],
# ["Desc", 200, ["descriptn", str, "text", {} ], ["icon",str,"pixbuf",{}] ],
#
# An according entries list then would contain a dictionary for each row:
# entries = [ {"titlerow":"first", "interndat":123}, {"titlerow":"..."}, ]
# Keys not mentioned in the datamap get ignored, and defaults are applied
# for missing cols. All values must already be in the correct type however.
#
@staticmethod
def columns(widget, datamap=[], entries=[], pix_entry=False):
# create treeviewcolumns?
if (not widget.get_column(0)):
# loop through titles
datapos = 0
for n_col,desc in enumerate(datamap):
# check for title
if (type(desc[0]) != str):
datapos += 1 # if there is none, this is just an undisplayed data column
continue
# new tvcolumn
col = gtk.TreeViewColumn(desc[0]) # title
col.set_resizable(True)
# width
if (desc[1] > 0):
col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
col.set_fixed_width(desc[1])
# loop through cells
for var in xrange(2, len(desc)):
cell = desc[var]
# cell renderer
if (cell[2] == "pixbuf"):
rend = gtk.CellRendererPixbuf() # img cell
if (cell[1] == str):
cell[3]["stock_id"] = datapos # for stock icons
expand = False
else:
pix_entry = datapos
cell[3]["pixbuf"] = datapos
else:
rend = gtk.CellRendererText() # text cell
cell[3]["text"] = datapos
col.set_sort_column_id(datapos) # only on textual cells
# attach cell to column
col.pack_end(rend, expand=cell[3].get("expand",True))
# apply attributes
for attr,val in cell[3].iteritems():
col.add_attribute(rend, attr, val)
# next
datapos += 1
# add column to treeview
widget.append_column(col)
# finalize widget
widget.set_search_column(2) #??
widget.set_reorderable(True)
# add data?
if (entries):
#- expand datamap
vartypes = [] #(str, str, bool, str, int, int, gtk.gdk.Pixbuf, str, int)
rowmap = [] #["title", "desc", "bookmarked", "name", "count", "max", "img", ...]
if (not rowmap):
for desc in datamap:
for var in xrange(2, len(desc)):
vartypes.append(desc[var][3]) # content types
rowmap.append(desc[var][0]) # dict{} column keys in entries[] list
# create gtk array storage
ls = gtk.ListStore(*vartypes) # could be a TreeStore, too
# prepare for missing values, and special variable types
defaults = {
str: "",
unicode: u"",
bool: False,
int: 0,
gtk.gdk.Pixbuf: gtk.gdk.pixbuf_new_from_data("\0\0\0\0",gtk.gdk.COLORSPACE_RGB,True,8,1,1,4)
}
if gtk.gdk.Pixbuf in vartypes:
pix_entry = vartypes.index(gtk.gdk.Pixbuf)
# sort data into gtk liststore array
for row in entries:
# generate ordered list from dictionary, using rowmap association
row = [ row.get( skey , defaults[vartypes[i]] ) for i,skey in enumerate(rowmap) ]
# autotransform string -> gtk image object
if (pix_entry and type(row[pix_entry]) == str):
row[pix_entry] = gtk.gdk.pixbuf_new_from_file(row[pix_entry])
# add
ls.append(row) # had to be adapted for real TreeStore (would require additional input for grouping/level/parents)
# apply array to widget
widget.set_model(ls)
return ls
pass
。虽然我不得不承认我自己在Treeviews上做得不多,但我发现它确实很容易掌握,而且非常强大
wxWidgets调用等效控件a
[Edit]在您的情况下,该选项实际上可能更有用。试试看,也许?尤其是它的
更新:我认为猕猴桃的发展已经转移到了。我以前从未见过猕猴桃。谢谢,Johannes Sasongko 这里还有一些我保留的书签。其中一些是其他工具包(GTK、wxWidgets)的包装,而另一些是独立的:
(为了其他看到这篇文章的人,我已经包括了一些已经提到的内容。我本想把这篇文章作为评论发布,但有点太长了。)另请参见这是如何回答他的问题的?虽然我已经有一段时间没有使用这两个库了,但我觉得PyGTK比wxPython更高级。我在wxTreeCtrl文档中没有看到任何建议您可以这样做的内容,例如,只需传递一本字典就可以了。这并不像我第一次想的那样有用。我肯定我在wxPython网站上看到过这样的例子,但现在我找不到了:-/我无论如何都要调查一下。WX使用GTK作为后端,所以至少不能是视觉降级。但由于它是compat包装器,所以它可能是公共分母抽象级别。但是,我最感兴趣的是TreeView API。只是还没有看到相关的文件…我得买些票。还有一些可以痛打我自己的东西。事实上,我以前读过关于猕猴桃的书,但不知怎么的,在实施的时候忽略了它。这正是我想要的。只需检查一下是否可以像信号回调一样获取ObjectList内容。列表中的要点非常好。我以前见过Dabo,它看起来非常高级,特别是在treeview/grid上提供了一个数据视图。但是,找不到真正的API文档,所以我不确定UI组件是否可以独立于数据库源使用。AVC听起来更好!AVC是python语言图形界面小部件和应用程序变量之间的多平台、全自动实时连接