我正在尝试按钮点击时以编程方式添加TreeView,但没有运气。这是我的例子:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib, Gdk
class TreeView(Gtk.TreeView):
def __init__(self, items):
Gtk.TreeView.__init__(self)
# Creating the ListStore model
model = Gtk.ListStore(int, str, str)
for item in items:
model.append(item)
# attach model and renderers
self.set_model(model)
for i, column_name in enumerate(['c1', 'c2', 'c3']):
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn(column_name, renderer, text = i)
self.append_column(column)
if __name__ == "__main__":
tv = [
[ 3, 'AST', 'Practica 1' ],
[ 5, 'AST', 'Practica 2' ],
[ 8, 'PBE', 'Practica 3' ]
]
def add(button):
table = TreeView(tv)
box.add(table)
win.show_all()
win = Gtk.Window()
win.set_position(Gtk.WindowPosition.CENTER)
win.set_border_width(10)
win.set_default_size(600, 400)
win.connect("destroy", Gtk.main_quit)
box = Gtk.Box(orientation = Gtk.Orientation.VERTICAL)
button = Gtk.Button.new_with_label("Add")
button.connect("clicked", add)
box.add(button)
win.add(box)
win.show_all()
Gtk.main()
当我单击按钮时,只显示列名,没有数据。如果我在主要内容中table = TreeView(tv)
和box.add(table)
写得很好。
在ubuntu 16.04上运行。 gtk3版本:3.18.9
编辑:
交换两个TreeView
的示例。行为不一致,但适用于ListBox
仿真:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib, Gdk
def replace_widget(old, new):
parent = old.get_parent()
props = {}
for key in Gtk.ContainerClass.list_child_properties(type(parent)):
props[key.name] = parent.child_get_property(old, key.name)
parent.remove(old)
parent.pack_start(new, False, False, 0)
for name, value in props.items():
parent.child_set_property(new, name, value)
new.show_all()
# native TreeView: doesn't work!
class TreeView(Gtk.TreeView):
def __init__(self, items, **kwargs):
# Creating the ListStore model
model = Gtk.ListStore(*[type(value) for value in items[0].values()])
for item in items:
model.append(list(item.values()))
# Creating the TreeView
super().__init__(model = model, **kwargs)
#self.set_model(model)
self.get_selection().set_mode(Gtk.SelectionMode.NONE) # disable selection
for i, column_name in enumerate(list(items[0].keys())):
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn(column_name, renderer, text = i)
column.props.expand = True
self.append_column(column)
'''
# TreeView ListBox emulation: works!
class TreeView(Gtk.ListBox):
def __init__(self, items, **kwargs):
super().__init__(**kwargs)
# header
row = Gtk.ListBoxRow()
self.add(row)
box = Gtk.Box(orientation = Gtk.Orientation.HORIZONTAL, homogeneous = True)
row.add(box)
for header in items[0].keys():
header_label = Gtk.Label(header, halign = Gtk.Align.START)
box.pack_start(header_label, True, True, 0)
# data rows
for i, item in enumerate(items):
row = Gtk.ListBoxRow()
self.add(row)
box = Gtk.Box(orientation = Gtk.Orientation.HORIZONTAL, homogeneous = True)
row.add(box)
for column in item.values():
box.pack_start(Gtk.Label(str(column), halign = Gtk.Align.START), True, True, 0)
'''
if __name__ == "__main__":
tasks = [
{ 'date': '2018-09-30', 'subject': 'AST', 'name': 'Pràctica 1' },
{ 'date': '2018-10-10', 'subject': 'AST', 'name': 'Pràctica 2' },
{ 'date': '2018-12-05', 'subject': 'AST', 'name': 'Pràctica 3' },
{ 'date': '2018-12-08', 'subject': 'AST', 'name': 'Pràctica 4' },
{ 'date': '2018-10-08', 'subject': 'PBE', 'name': 'Project Plan' },
{ 'date': '2018-10-22', 'subject': 'PBE', 'name': 'Requirement Specifications' },
{ 'date': '2018-11-25', 'subject': 'PBE', 'name': 'Critical Design Report' },
{ 'date': '2018-12-13', 'subject': 'PBE', 'name': 'Final Report' }
]
marks = [
{ 'subject': 'AST', 'name': 'control teoria', 'mark': 7.5, 'student': 'C5CC358A' },
{ 'subject': 'AST', 'name': 'Lab 1', 'mark': 3.5, 'student': 'C5CC358A' },
{ 'subject': 'AST', 'name': 'Lab 2', 'mark': 4.7, 'student': 'C5CC358A' },
{ 'subject': 'AST', 'name': 'final', 'mark': 8.6, 'student': 'C5CC358A' },
{ 'subject': 'PBE', 'name': 'puzzle1', 'mark': 2.8, 'student': 'C5CC358A' },
{ 'subject': 'PBE', 'name': 'puzzle2', 'mark': 8.4, 'student': 'C5CC358A' },
{ 'subject': 'PBE', 'name': 'control', 'mark': 7.3, 'student': 'C5CC358A' },
{ 'subject': 'PBE', 'name': 'CDR', 'mark': 8, 'student': 'C5CC358A' },
{ 'subject': 'PBE', 'name': 'FR', 'mark': 9, 'student': 'C5CC358A' }
]
def clicked(button):
replace_widget(first, TreeView(marks))
win = Gtk.Window()
win.set_position(Gtk.WindowPosition.CENTER)
win.set_border_width(10)
win.set_default_size(600, 400)
win.connect("destroy", Gtk.main_quit)
box = Gtk.Box(orientation = Gtk.Orientation.VERTICAL)
button = Gtk.Button.new_with_label("Replace")
button.connect("clicked", clicked)
first = TreeView(tasks)
box.pack_start(first, False, False, 0)
box.pack_start(button, False, False, 0)
win.add(box)
win.show_all()
Gtk.main()