Home
Categories
WIKI
Topic
User
LANGUAGE:
中文
English
本人用python为 treeview写了一种数据结构
社区开发
2763
views ·
6
replies ·
To
floor
Go
vala2012
deepin
2013-04-14 00:20
Author
#!coding:utf-8
import gtk
class TreeViewBase(gtk.Button):
def __init__(self):
self.nodes = Nodes()
self.nodes.connect("update-data", self.__nodes_update_data_event)
def __nodes_update_data_event(self, nodes):
print "__nodes_update_data_event:", nodes.text
class Nodes(list):
def __init__(self):
list.__init__(self)
self.this = None
self.__function_dict = {}
def add(self, text):
node = Node()
node.text = text
node.parent = self
if self.this:
node.leave = self.this.leave + 1
node.connect("update-data", self.__node_update_data_event)
self.append(node)
self.emit("update-data", node)
return node
def __node_update_data_event(self, node):
self.emit("update-data", node)
def connect(self, event_name, function_point):
self.__function_dict[event_name] = function_point
def emit(self, event_name, *arg):
if self.__function_dict.has_key(event_name):
self.__function_dict[event_name](*arg)
class Node(object):
def __init__(self):
self.__function_dict = {}
self.text = ""
self.__pixbuf = None
self.children = []
#
self.nodes = Nodes()
self.nodes.this = self
self.nodes.connect("update-data", self.__nodes_update_data_event)
#
self.parent = None # 获取当前树节点的夫节点.
self.leave = 0 # 树的深度,不懂的看数据结构.
self.__last_node = [] # 获取最后一个子树节点.
self.__first_node = [] # 获取树节点集合中的第一个子树节点.
self.__next_node = [] # 获取下一个同级节点.
self.__prev_node = [] # 获取上一个同级节点.
self.__index = None # 获取树节点在树节点集合中的位置.
####################
self.is_expanded = True # 是否展开状态.
self.is_selected = False # 是否选中状态.
self.is_editing = False # 是否可编辑状态.
####################
self.node_font = None # 字体.
self.next_visible_node = None # 获取下一个可见树节点.
self.is_visible = True # 是否可见.
def __nodes_update_data_event(self, nodes):
self.emit("update-data", nodes)
def connect(self, event_name, function_point):
self.__function_dict[event_name] = function_point
def emit(self, event_name, *arg):
if self.__function_dict.has_key(event_name):
self.__function_dict[event_name](*arg)
def add_widget(self, child_widget):
self.children.append(child_widget)
self.emit()
@property
def last_node(self):
# 获取最后一个子树节点.
return self.__last_node
@last_node.getter
def last_node(self):
if self.nodes == []:
return None
else:
return self.nodes[len(self.nodes)-1]
@property
def first_node(self):
# 获取树节点集合中的第一个子树节点.
return self.__first_node
@first_node.getter
def first_node(self):
if self.nodes == []:
return None
else:
return self.nodes[0]
@property
def prev_node(self):
return self.__prev_node
@prev_node.getter
def prev_node(self):
# 获取上一个同级节点.
if self.parent:
index = self.parent.index(self)
if index:
node = self.parent[index - 1]
self.__prev_node = node
return self.__prev_node
return None
@property
def next_node(self):
# 获取下一个同级节点.
return self.__next_node
@next_node.getter
def next_node(self):
if self.parent:
index = self.parent.index(self)
if index < len(self.parent) - 1:
node = self.parent[index + 1]
self.__next_node = node
return self.__next_node
return None
@next_node.deleter
def next_node(self):
del self.__next_node
@property
def index(self):
return self.__index
@index.getter
def index(self):
if self.parent:
_index = self.parent.index(self)
return _index
return None
@property
def pixbuf(self):
return self.__pixbuf
@pixbuf.getter
def pixbuf(self):
return self.__pixbuf
@pixbuf.setter
def pixbuf(self, pixbuf):
self.__pixbuf = pixbuf
self.emit()
@pixbuf.deleter
def pixbuf(self, pixbuf):
del self.__pixbuf
if __name__ == "__main__":
win = gtk.Window(gtk.WINDOW_TOPLEVEL)
win.set_size_request(300, 300)
treeview_base = TreeViewBase()
treeview_base.set_size_request(1500, 15000)
scroll_win = gtk.ScrolledWindow()
#
node1 = treeview_base.nodes.add("root1")
node2 = treeview_base.nodes.add("root2")
node3 = treeview_base.nodes.add("root3")
node4 = treeview_base.nodes.add("root4")
'''
for i in range(1, 30000):
treeview_base.nodes.add("root" + str(i))
'''
node1_1 = node1.nodes.add("roo1-1")
node1_2 = node1.nodes.add("roo1-2")
node1_3 = node1.nodes.add("roo1-3")
node1_1_1 = node1_1.nodes.add("root1-1-1")
node1_4 = node1.nodes.add("roo1-4")
node1_5 = node1.nodes.add("roo1-5")
print node1.nodes[1].next_node.text
print node1.nodes[1].prev_node.text
#
#
scroll_win.add_with_viewport(treeview_base)
win.add(scroll_win)
win.show_all()
gtk.main()
Copy the Code
连接信号后,只要数据层更新,就能通知上层...
在界面层的代码中加入这个.
nodes = Nodes()
nodes.connect("update-data", ...........), 这样的方法类似于 C语言的 函数指针
nodes[0].nodes[3].is_expand = True ; 展开
nodes[0].nodes[3].is_expand = False ; 关闭展开.
nodes[0].nodes[3]. prev_node / next_node; 获取同级的兄弟节点(左右).
加上可以获取父亲节点,通过父亲节点去获取他的兄弟节点, 这样就可以将 leavel 为0的全部获取出来.
或者leave 为 3 的全部获取出来.
选区_012.png
选区_013.png
选区_014.png
我重载函数以后,我自绘....是不是很有味道..... 但数据更新和改变,删除的时候,如果不是重绘的区域,是不会进行重绘的...
哪怕后面删除了1万个数据,绘制层上的可视区域内没有这个数据在上面,是不进行重绘的. 重绘代表的是可视区域的,不是全部高度和宽度.
后续加入 改变一个数据的时候,只对这个可视区域的 这一个数据的区域进行重绘.
选区_015.png
完全高仿C#哦... ...
源码...
from utils import get_match_parent
#from utils import propagate_expose
from utils import get_text_size
from draw import draw_text, draw_pixbuf
from color import alpha_color_hex_to_cairo, color_hex_to_cairo
import gtk
from gtk import gdk
import gobject
import random
def type_check(type_name, type_str):
return type(type_name).__name__ == type_str
class TreeViewChild(object):
widget = None
x = 0
y = 0
w = 80
h = 40
class TreeViewBase(gtk.Container):
def __init__(self):
gtk.Container.__init__(self)
self.__init_values()
def __init_values(self):
self.add_events(gtk.gdk.ALL_EVENTS_MASK)
#
self.header_height = 35
self.node_height = 35
self.leave_width = 20
#
self.children = []
#
self.paint_nodes_event = self.__paint_nodes_event
self.paint_nodes_background = self.__paint_nodes_background
#
self.__function_dict = {}
self.__nodes_list = []
self.nodes = Nodes()
self.nodes.connect("update-data", self.__nodes_update_data_event)
self.nodes.connect("added-data", self.__nodes_added_data_event)
self.nodes.connect("remove-data", self.__nodes_remove_data_event)
self.nodes.connect("is-expanded", self.__nodes_is_expanded_event)
self.__init_values_columns()
def __nodes_update_data_event(self, node):
# 当有数据更新时,进行重绘.
# 判断是否在重绘的区域内,如果不是,只设置数据.
if self.tree_view_find_node_in_draw_area(node):
self.tree_view_queue_draw_area()
def __nodes_added_data_event(self, node):
# 添加数据更新树型结构的映射列表.
if node.parent == self.nodes:
self.__nodes_list.append(node)
self.__tree_view_set_add_size()
def __nodes_is_expanded_event(self, node):
#print "__nodes_is_expanded_event", node.text
if node.is_expanded:
if node.nodes: # 判断是否有子节点.
if node.leave: # 判断是不是根节点.
if not node.parent.this.is_expanded: # 判断父亲节点是否已经展开了.
node.parent.this.is_expanded = True
for child_node in node.nodes:
self.__nodes_add_data(child_node)
else:
for child_node in node.nodes:
self.__nodes_add_data(child_node)
else:
for child_node in node.nodes:
self.__nodes_add_data(child_node)
elif not node.is_expanded:
for flase_child_node in node.nodes:
flase_child_node.is_expanded = False
self.__nodes_remove_data(flase_child_node)
def __nodes_add_data(self, node):
parent = node.parent
node_to_parent_index = parent.index(node)
parent_to_list_index = self.__nodes_list.index(parent.this)
index = parent_to_list_index + node_to_parent_index + 1
self.__nodes_list.insert(index, node)
self.__tree_view_set_add_size()
def __nodes_remove_data(self, node):
index = self.__nodes_list.index(node)
self.__nodes_list.pop(index)
self.__tree_view_set_remove_size()
def __tree_view_set_add_size(self):
size = self.get_size_request()
self.set_size_request(size[0], size[1] + self.node_height)
def __tree_view_set_remove_size(self):
size = self.get_size_request()
self.set_size_request(size[0], size[1] - self.node_height)
def __nodes_remove_data_event(self, node):
# 当有数据删除时,更新映射列表.
print "remove............", node.text
if node in self.__nodes_list:
self.__nodes_list.remove(node)
# 判断删除的数据是否在重绘区域,如果不是,不进行重绘.
if self.tree_view_find_node_in_draw_area(node):
self.tree_view_queue_draw_area()
def __init_values_columns(self):
self.columns = []
def connect_event(self, event_name, function_potion):
self.__function_dict[event_name] = function_point
def emit(self, event_name, *arg):
if self.__function_dict.has_key(event_name):
self.__function_dict[event_name](*arg)
def do_map(self):
print "do..map.."
gtk.Container.do_map(self)
self.set_flags(gtk.MAPPED)
#
self.window.show()
def do_umap(self):
print "do_map:"
gtk.Container.do_umap(self)
self.window.hide()
def do_realize(self):
print "do_realize..."
self.set_realized(True)
#
self.__init_window()
#
self.__init_children()
#
self.scroll_win = get_match_parent(self, ["ScrolledWindow"])
self.hadjustment = self.scroll_win.get_hadjustment()
self.vadjustment = self.scroll_win.get_vadjustment()
self.hadjustment.connect("value-changed", self.__list_view_adjustments_changed)
self.vadjustment.connect("value-changed", self.__list_view_adjustments_changed)
self.queue_resize()
def __list_view_adjustments_changed(self, adjustments):
self.tree_view_queue_draw_area()
def __init_window(self):
self.window = gdk.Window(
self.get_parent_window(),
window_type=gdk.WINDOW_CHILD,
x=self.allocation.x,
y=self.allocation.y,
width=self.allocation.width,
height=self.allocation.height,
colormap=self.get_colormap(),
wclass=gdk.INPUT_OUTPUT,
visual=self.get_visual(),
event_mask=(self.get_events()
| gtk.gdk.VISIBILITY_NOTIFY
| gdk.EXPOSURE_MASK
| gdk.SCROLL_MASK
| gdk.POINTER_MOTION_MASK
| gdk.ENTER_NOTIFY_MASK
| gdk.LEAVE_NOTIFY_MASK
| gdk.BUTTON_PRESS_MASK
| gdk.BUTTON_RELEASE_MASK
| gdk.KEY_PRESS_MASK
| gdk.KEY_RELEASE_MASK
))
self.window.set_user_data(self)
self.style.set_background(self.window, gtk.STATE_NORMAL)
def __init_children(self):
for child in self.children:
print "child:", child.widget.set_parent_window(self.window)
def do_unrealize(self):
#
pass
def do_expose_event(self, e):
gtk.Container.do_expose_event(self, e)
if e.window == self.window:
cr = self.window.cairo_create()
start_index = max(int(self.scroll_win.get_vadjustment().get_value() / self.node_height), 0)
end_index = (start_index + (self.scroll_win.allocation.height) / self.node_height) + 1
y_padding = 0 + start_index * self.node_height
# draw background.
x = 0
y = 0 + start_index * self.node_height
w = self.scroll_win.allocation.width
h = self.scroll_win.allocation.height + self.node_height * 2
self.paint_nodes_background(cr, x, y, w, h)
# draw node.
for node in self.__nodes_list[start_index:end_index]:
node_event = NodesEvent()
node_event.cr = cr
node_event.node = node
node_event.x = 0
node_event.y = y_padding
node_event.w = self.scroll_win.allocation.width
node_event.h = self.node_height #self.scroll_win.allocation.height
'''
node_event.draw_text = draw_text # 写成 set/get , 忽略 cr参数.
node_event.draw_pixbuf = draw_pixbuf # 写成 set/get , 忽略 cr参数.
'''
self.paint_nodes_event(node_event)
y_padding += self.node_height
#
return False
def __paint_nodes_background(self, cr, x, y, w, h):
cr.set_source_rgba(0, 0, 0, 0.85)
cr.rectangle(x, y, w, h)
cr.fill()
def __paint_nodes_event(self, node_event):
if node_event.node.leave == 0: # 根节点.
x = node_event.x + 10
if node_event.node.is_expanded:
draw_text(node_event.cr,
"-",
node_event.x,
node_event.y + get_text_size("+")[1]/2)
else:
draw_text(node_event.cr,
"+",
node_event.x,
node_event.y + get_text_size("+")[1]/2)
else:
x_padding = node_event.node.leave * self.leave_width
x = node_event.x + 10 + x_padding
if node_event.node.is_expanded:
draw_text(node_event.cr,
"*",
node_event.x + x_padding,
node_event.y + get_text_size("*")[1]/2)
else:
if node_event.node.leave < 2:
draw_text(node_event.cr,
">",
node_event.x + x_padding,
node_event.y + get_text_size(">")[1]/2)
draw_text(node_event.cr,
node_event.node.text,
x,
node_event.y + get_text_size(node_event.node.text)[1]/2)
def tree_view_queue_draw_area(self):
self.scroll_win = get_match_parent(self, ["ScrolledWindow"])
if self.scroll_win:
start_index = max(int(self.scroll_win.get_vadjustment().get_value() / self.node_height), 0)
end_index = (start_index + (self.scroll_win.allocation.height) / self.node_height) + 1
w = self.scroll_win.allocation.width
h = self.scroll_win.allocation.height
else:
start_index = 0
end_index = self.allocation.height / self.allocation.height
w = self.allocation.width
h = self.allocation.height
x = 0
y = 0 + start_index * self.node_height
self.queue_draw_area(x, y, w, h)
def tree_view_find_node_in_draw_area(self, node):
if node in self.__nodes_list:
index = self.__nodes_list.index(node)
#
self.scroll_win = get_match_parent(self, "ScrolledWindow")
if self.scroll_win:
start_index = max(int(self.scroll_win.get_vadjustment().get_value() / self.node_height), 0)
end_index = (start_index + (self.scroll_win.allocation.height) / self.node_height) + 1
else:
start_index = 0
end_index = 0
if start_index <= index <= end_index:
return True
return False
def do_motion_notify_event(self, e):
#print "do--mo--no--ev", e.x
if e.window == self.window:
index = int(e.y) / self.node_height
self.tree_view_queue_draw_area()
return False
def do_button_press_event(self, e):
#node.is_expanded = False #not node.is_expanded
#node.is_expanded = True
node = self.__nodes_list[int(e.y/self.node_height)]
node.is_expanded = not node.is_expanded
self.tree_view_queue_draw_area()
return False
def do_button_release_event(self, e):
#print "do_button_release_event..."
return False
def do_enter_notify_event(self, e):
#print "do_enter_notify_event..."
return False
def do_leave_notify_event(self, e):
#print "do_leave_notify_event..."
return False
def do_key_press_event(self, e):
print "do_key_press_event..."
def do_key_release_event(self, e):
print "do_key_release_event..."
def do_size_request(self, req):
'''
for child in self.children:
child.widget.size_request()
'''
def do_size_allocate(self, allocation):
print "do_size_allocate..."
gtk.Container.do_size_allocate(self, allocation)
'''
for child in self.children:
allocation = gdk.Rectangle()
allocation.x = child.x
allocation.y = child.y
allocation.width = child.w
allocation.height = child.h
child.widget.size_allocate(allocation)
'''
#
if self.get_realized():
self.window.move_resize(
self.allocation.x,
self.allocation.y,
self.allocation.width,
self.allocation.height)
def do_show(self):
gtk.Container.do_show(self)
#self.edit_entry.set_visible(False)
def do_destroy(self):
print "do_destroy..."
def do_forall(self, include_internals, callback, data):
'''
for child in self.children:
callback(child.widget, data)
'''
pass
def add_widget(self, child, x=0, y=0, w=0, h=0):
if self.window:
child.set_parent_window(self.window)
else:
child.set_parent(self)
tree_view_child = TreeViewChild()
tree_view_child.widget = child
tree_view_child.x = x
tree_view_child.y = y
tree_view_child.w = max(w, 80)
tree_view_child.h = max(h, self.node_height)
self.children.append(tree_view_child)
############################################################
def delete(self, node): # 删除数据.
node.parent.delete(node)
def expanded_all(self): # 展开所有节点.
pass
gobject.type_register(TreeViewBase)
class NodesEvent(object):
def __init__(self):
self.cr = None
self.x = 0
self.y = 0
self.w = 0
self.h = 0
self.node = None
'''
self.draw_pixbuf
self.draw_text
'''
class Nodes(list):
def __init__(self):
list.__init__(self)
self.this = None
self.__function_dict = {}
def add(self, text):
node = Node()
node.text = text
node.parent = self
if self.this:
node.leave = self.this.leave + 1
node.connect("update-data", self.__node_update_data_event)
node.connect("added-data", self.__node_added_data_event)
node.connect("remove-data", self.__node_remove_data_event)
node.connect("is-expanded", self.__Node_is_expanded_event)
self.append(node)
self.emit("added-data", node)
return node
def delete(self, node):
self.emit("remove-data", node)
self.remove(node)
for child_node in node.nodes[:]:
node.nodes.delete(child_node)
def __node_update_data_event(self, node):
self.emit("update-data", node)
def __node_added_data_event(self, node):
self.emit("added-data", node)
def __node_remove_data_event(self, node):
self.emit("remove-data", node)
def __Node_is_expanded_event(self, node):
self.emit("is-expanded", node)
def connect(self, event_name, function_point):
self.__function_dict[event_name] = function_point
def emit(self, event_name, *arg):
if self.__function_dict.has_key(event_name):
self.__function_dict[event_name](*arg)
class Node(object):
def __init__(self):
self.__function_dict = {}
self.text = ""
#self.sub_items = SubItems()
self.__pixbuf = None
self.children = []
#
self.nodes = Nodes()
self.nodes.this = self
self.nodes.connect("update-data", self.__nodes_update_data_event)
self.nodes.connect("added-data", self.__nodes_added_data_event)
self.nodes.connect("remove-data", self.__nodes_remove_data_event)
self.nodes.connect("is-expanded", self.__nodes_is_expanded_event)
#
self.parent = None # 获取当前树节点的夫节点.
self.leave = 0 # 树的深度,不懂的看数据结构.
self.__last_node = [] # 获取最后一个子树节点.
self.__first_node = [] # 获取树节点集合中的第一个子树节点.
self.__next_node = [] # 获取下一个同级节点.
self.__prev_node = [] # 获取上一个同级节点.
self.__index = None # 获取树节点在树节点集合中的位置.
####################
self.__is_expanded = False # 是否展开状态.
self.is_selected = False # 是否选中状态.
self.is_editing = False # 是否可编辑状态.
####################
self.node_font = None # 字体.
self.next_visible_node = None # 获取下一个可见树节点.
self.is_visible = True # 是否可见.
def __nodes_update_data_event(self, nodes):
self.emit("update-data", nodes)
def __nodes_added_data_event(self, nodes):
self.emit("added-data", nodes)
def __nodes_remove_data_event(self, nodes):
self.emit("remove-data", nodes)
def __nodes_is_expanded_event(self, nodes):
self.emit("is-expanded", nodes)
def connect(self, event_name, function_point):
self.__function_dict[event_name] = function_point
def emit(self, event_name, *arg):
if self.__function_dict.has_key(event_name):
self.__function_dict[event_name](*arg)
'''
def add_widget(self, child_widget):
self.children.append(child_widget)
'''
@property
def is_expanded(self):
return self.__is_expanded
@is_expanded.setter
def is_expanded(self, check):
# 判断 is_expanded 不能相同 却 nodes不为空.
if self.__is_expanded != check and self.nodes:
self.__is_expanded = check
self.emit("is-expanded", self)
@is_expanded.getter
def is_expanded(self):
return self.__is_expanded
@property
def text(self):
return self.__text
@text.setter
def text(self, text):
self.__text = text
self.emit("update-data", self)
@text.getter
def text(self):
return self.__text
@property
def last_node(self):
# 获取最后一个子树节点.
return self.__last_node
@last_node.getter
def last_node(self):
if self.nodes == []:
return None
else:
return self.nodes[len(self.nodes)-1]
@property
def first_node(self):
# 获取树节点集合中的第一个子树节点.
return self.__first_node
@first_node.getter
def first_node(self):
if self.nodes == []:
return None
else:
return self.nodes[0]
@property
def prev_node(self):
return self.__prev_node
@prev_node.getter
def prev_node(self):
# 获取上一个同级节点.
if self.parent:
index = self.parent.index(self)
if index:
node = self.parent[index - 1]
self.__prev_node = node
return self.__prev_node
return None
@property
def next_node(self):
# 获取下一个同级节点.
return self.__next_node
@next_node.getter
def next_node(self):
if self.parent:
index = self.parent.index(self)
if index < len(self.parent) - 1:
node = self.parent[index + 1]
self.__next_node = node
return self.__next_node
return None
@next_node.deleter
def next_node(self):
del self.__next_node
@property
def index(self):
return self.__index
@index.getter
def index(self):
if self.parent:
_index = self.parent.index(self)
return _index
return None
@property
def pixbuf(self):
return self.__pixbuf
@pixbuf.getter
def pixbuf(self):
return self.__pixbuf
@pixbuf.setter
def pixbuf(self, pixbuf):
self.__pixbuf = pixbuf
#self.emit()
@pixbuf.deleter
def pixbuf(self, pixbuf):
del self.__pixbuf
if __name__ == "__main__":
def test_paint_nodes_event(e):
if e.node.leave == 0: # 根节点.
draw_text(e.cr,
e.node.text,
e.x + e.w/2 - get_text_size(e.node.text)[0]/2,
e.y + e.h/2 - get_text_size(e.node.text)[1]/2)
e.cr.set_source_rgba(1, 1, 1, 1.0)
e.cr.rectangle(e.x, e.y, e.w, e.h)
e.cr.stroke()
else:
pixbuf = gtk.gdk.pixbuf_new_from_file("logo.png")
pixbuf = pixbuf.scale_simple(e.h, e.h, gtk.gdk.INTERP_BILINEAR)
draw_pixbuf(e.cr, pixbuf, e.x + e.w/2 - pixbuf.get_width()/2 + e.node.leave * e.h, e.y)
draw_text(e.cr,
e.node.text,
e.x + e.w/2 - get_text_size(e.node.text)[1]/2 + pixbuf.get_width() + e.node.leave * e.h,
e.y + e.h/2 - get_text_size(e.node.text)[1]/2)
win = gtk.Window(gtk.WINDOW_TOPLEVEL)
win.set_size_request(300, 300)
treeview_base = TreeViewBase()
treeview_base.paint_nodes_event = test_paint_nodes_event
scroll_win = gtk.ScrolledWindow()
#
node1 = treeview_base.nodes.add("小学")
node2 = treeview_base.nodes.add("初中")
node3 = treeview_base.nodes.add("高中")
node4 = treeview_base.nodes.add("大学")
node5 = treeview_base.nodes.add("社会")
for i in range(1, 10000):
treeview_base.nodes.add("test" + str(i))
print treeview_base.nodes[9999].text
for i in range(1, 7):
node1.nodes.add(str(i) + "年级")
node1.nodes[0].nodes.add("1年级(" + str(i) + ")班")
node1.nodes[0].nodes[0].nodes.add("小明")
node1.nodes[0].nodes[0].nodes.add("小王")
node1.nodes[0].nodes[0].nodes.add("小张")
node1.nodes[0].nodes[0].nodes.add("小红")
node1.nodes[0].nodes[0].is_expanded = True
for i in range(1, 4):
node2.nodes.add("初" + str(i))
node3.nodes.add("高" + str(i))
node4.nodes.add("大" + str(i))
node4.nodes[0].nodes.add("软件班级ZB4890" + str(i))
#
scroll_win.add_with_viewport(treeview_base)
win.add(scroll_win)
win.show_all()
gtk.main()
Copy the Code
Reply
Like 0
Favorite
View the author
All Replies
go2012
deepin
2013-04-14 07:54
#1
不错,顶楼主,果然是好东西... ...
Reply
Like 0
View the author
java2012
deepin
2013-04-14 07:55
#2
不错,顶楼主,要发扬广大哈,楼主继续努力...
Reply
Like 0
View the author
cxbii
deepin
2013-04-14 22:54
#3
lz好厉害。。。。我顶你。。
Reply
Like 0
View the author
vala2012
deepin
2013-04-15 02:03
#4
lz好厉害。。。。我顶你。。
哈哈哈,坛主好人一枚
Reply
Like 0
View the author
cxbii
deepin
2013-04-15 04:56
#5
[quote]lz好厉害。。。。我顶你。。
哈哈哈,坛主好人一枚[/quote]
:? 好人卡么
我也要学编程。。
Reply
Like 0
View the author
vala2012
deepin
2013-04-15 09:29
#6
[quote][quote]lz好厉害。。。。我顶你。。
哈哈哈,坛主好人一枚[/quote]
:? 好人卡么
我也要学编程。。[/quote]
学吧,编程一点都不难, 开源这么多代码, 看看就会拉! 不行照抄一个, 支持你.... ...!!
难的是搞游戏引擎的人(数学物理要牛).... .. 不是一般人能搞的.. 还有搞协议的...
Reply
Like 0
View the author
Please
sign
in first
New Thread
Popular Ranking
Change
Cannot connect to samba printer
Updating 25 Beta to 25 Release
Popular Events
More
连接信号后,只要数据层更新,就能通知上层...
在界面层的代码中加入这个.
nodes = Nodes()
nodes.connect("update-data", ...........), 这样的方法类似于 C语言的 函数指针
nodes[0].nodes[3].is_expand = True ; 展开
nodes[0].nodes[3].is_expand = False ; 关闭展开.
nodes[0].nodes[3]. prev_node / next_node; 获取同级的兄弟节点(左右).
加上可以获取父亲节点,通过父亲节点去获取他的兄弟节点, 这样就可以将 leavel 为0的全部获取出来.
或者leave 为 3 的全部获取出来.
选区_012.png
选区_013.png
选区_014.png
我重载函数以后,我自绘....是不是很有味道..... 但数据更新和改变,删除的时候,如果不是重绘的区域,是不会进行重绘的...
哪怕后面删除了1万个数据,绘制层上的可视区域内没有这个数据在上面,是不进行重绘的. 重绘代表的是可视区域的,不是全部高度和宽度.
后续加入 改变一个数据的时候,只对这个可视区域的 这一个数据的区域进行重绘.
选区_015.png
完全高仿C#哦... ...
源码...