Re: [pygtk] push huge array into liststore
Hi, a solution is written into the FAQ: http://faq.pygtk.org/index.py?req=show&file=faq13.043.htp treeview.freeze_child_notify() treeview.set_model(None) # Add rows to the model # ... treeview.set_model(model) treeview.thaw_child_notify() Regards, Zyphos Tim Evans a écrit : > On 2010-07-13 3:48, Cornelius Kölbel wrote: > >> Dear list, >> >> I got an array of dictionaries, that I want to add to a GTKListStore, >> that is displayed an a treeview. >> >> This is very slow. I already replaced the liststore.append by >> liststore.insert, which is much much faster. >> But still, filling the 10.000 values takes about 50 seconds. >> >> Is there any cool mapping function, to push the array to the liststore? >> I used a for loop to iterate over the array... >> I also tried while an to pop the array elements... >> >> It is something like this: >> >> data: array of dictionaries >> >> data = array( { 'v1' : 'something', 'v2': 'something else' } , >>{ 'v1' : 'another', 'v2': 'something completely diff' } >> ) >> >> >> for d in data: >> self.liststore.insert( 0, ( d.get("v1"), d.get("v2") )) >> >> >> ...is there a better way than doing a for loop? >> ...or a way to not have to interate over the 10.000 dicts? >> >> ...or is there a cool reading on performance tuning pyton? >> > > Some general ideas: > - Make sure the store isn't being viewed when you insert data, that > will slow it down. > > - Do attribute lookups outside big loops: > > append = self.liststore.append > get = d.get > for d in data: > append(0, (get('v1'), get('v2'), ...)) > > - Put the treeview into fixed height and width mode. Automatic sizing > is the enemy of treeview performance. This only works if all your > rows are the same height. The function calls you need are: > gtk.TreeViewColumn.set_sizing > with the gtk.TREE_VIEW_COLUMN_FIXED value > gtk.TreeViewColumn.set_fixed_width > gtk.TreeView.set_fixed_height_mode > > - If your list is large enough it may be worth subclassing > gtk.TreeModel and overriding the required methods. It's complex, but > it can avoid referencing all your data at tree build time, instead > loading as the user scrolls. > > - Write it in C. Always valid, even if as a last resort. > > ___ pygtk mailing list pygtk@daa.com.au http://www.daa.com.au/mailman/listinfo/pygtk Read the PyGTK FAQ: http://faq.pygtk.org/
Re: [pygtk] Drag and drop (DND) of gtk.Notebook tab to another widget [SOLVED]
Because there it seems that there is no source of this on internet, here is a way to achieve this. This is a hack, we are going to override the data parameter with the page number instead of the C pointer to the widget. ===Code.py=== notebook = gtk.notebook() drag_page_number = 0 # global var notebook.connect_after("drag_begin", _sig_notebook_drag_begin) notebook.connect_after("drag_data_get", _sig_notebook_drag_data_get) # do not use drag_source_set on Notebook, you will get a Segmentation Fault, use "set_tab_detachable" instead. # https://bugs.launchpad.net/ubuntu/+source/pygtk/+bug/604534 # notebook.drag_source_set(gtk.gdk.BUTTON1_MASK, [], gtk.gdk.ACTION_COPY) # add tabs to notebook notebook.append_page(child_widget, label) notebook.set_tab_detachable(child_widget, True) ... def _sig_notebook_drag_begin(widget, context): # Drag and drop begin, save current page number drag_page_number = notebook.get_current_page() def _sig_notebook_drag_data_get(widget, context, selection, info, timestamp): # Override the C pointer to the widget with page_number selection.set(selection.target, 8, str(drag_page_number)) # data is only of string type ! # The widget that will receive the drag and drop button = gtk.Button("Test") button.connect("drag_drop", _sig_drag_drop) button.connect("drag_data_received", _sig_drag_data_received) button.drag_dest_set(0, [], 0) # button can receive any drag and drop def _sig_drag_drop(widget, context, x, y, time): # widget = button here if "GTK_NOTEBOOK_TAB" in context.targets: widget.drag_get_data(context, "GTK_NOTEBOOK_TAB") context.finish(True, False, time) return True def _sig_drag_data_received(widget, context, x, y, selection, info, timestamp): # widget = button here src_widget = context.get_source_widget() # src_widget = notebook here the_page_number = int(selection.data) child_widget = src_widget.get_nth_page(the_page_number) ===End of code=== Zyphos Zyphos a écrit : > Hi, > I try to make a DND from a gtk.Notebook to another widget. > I receive the 'selection' on the other widget. > > The documentation say: > "The notebook will fill the selection with a reference to the child > widget that corresponds to the dropped tab." > > Src: > http://library.gnome.org/devel/pygtk/stable/class-gtknotebook.html#method-gtknotebook--set-tab-detachable > > Here is the selection of this DND ('drag-data-received'): > > Selection: SelectionData: > .data: str: �� > .format: int: 8 > .selection: str: XdndSelection > .target: str: GTK_NOTEBOOK_TAB > .type: str: GTK_NOTEBOOK_TAB > > But selection.data is a string with this "str: �� " (I think this is a > pointer reference to the C code child widget) it isn't usable with Python. > > How can I retrieve the notebook child widget which the DND come from ? > > Thank you for any suggestion. > > ___ pygtk mailing list pygtk@daa.com.au http://www.daa.com.au/mailman/listinfo/pygtk Read the PyGTK FAQ: http://faq.pygtk.org/
[pygtk] Drag and drop (DND) of gtk.Notebook tab to another widget
Hi, I try to make a DND from a gtk.Notebook to another widget. I receive the 'selection' on the other widget. The documentation say: "The notebook will fill the selection with a reference to the child widget that corresponds to the dropped tab." Src: http://library.gnome.org/devel/pygtk/stable/class-gtknotebook.html#method-gtknotebook--set-tab-detachable Here is the selection of this DND ('drag-data-received'): Selection: SelectionData: .data: str: �� .format: int: 8 .selection: str: XdndSelection .target: str: GTK_NOTEBOOK_TAB .type: str: GTK_NOTEBOOK_TAB But selection.data is a string with this "str: �� " (I think this is a pointer reference to the C code child widget) it isn't usable with Python. How can I retrieve the notebook child widget which the DND come from ? Thank you for any suggestion. ___ pygtk mailing list pygtk@daa.com.au http://www.daa.com.au/mailman/listinfo/pygtk Read the PyGTK FAQ: http://faq.pygtk.org/