pygtk:resizing
                Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
| Prossima revisione | Revisione precedente | ||
| pygtk:resizing [2009/01/13 23:42] – creata pietro | pygtk:resizing [2009/01/14 08:20] (versione attuale) – set_size_request pietro | ||
|---|---|---|---|
| Linea 1: | Linea 1: | ||
| - | == resize tweaks == | + | ====== resize tweaks  | 
| - | First: the method gtk.Window.resize() doesnt' | + | First: the method gtk.Window.resize() doesnt' | 
| Now: if a gtk.Window **w** has size (100,100) and we run the following code: | Now: if a gtk.Window **w** has size (100,100) and we run the following code: | ||
| Linea 32: | Linea 32: | ||
|           window.set_data(' |           window.set_data(' | ||
|    |    | ||
| - | def set_width(window, width): | + | def get_width(window): | 
| - |        | + |        | 
| + | if not width: | ||
| + | width = window.get_size()[0] | ||
| + | return width | ||
|    |    | ||
| - |       window.set_data('real width', | + | def get_height(window): | 
|       height = window.get_data(' |       height = window.get_data(' | ||
| if not height: | if not height: | ||
| height = window.get_size()[1] | height = window.get_size()[1] | ||
| - |          | + | return height | 
| + | |||
| + |   def set_width(window, | ||
| + | ensure_configure_handler(window) | ||
| + | |||
| + |       window.set_data(' | ||
| + |       height = get_height(window)  | ||
|       window.resize(width, |       window.resize(width, | ||
|      |      | ||
| Linea 46: | Linea 55: | ||
|    |    | ||
|       window.set_data(' |       window.set_data(' | ||
| - |       width = window.get_data('real width' | + |       width = get_width(window)  | 
| - | if not width: | + | |
| - | width = window.get_size()[0] | + | |
| - | + | ||
|       window.resize(width, |       window.resize(width, | ||
| + | ==== set_size_request ==== | ||
| + | Notice that set_size_request has a similar problem: if a gtk.Widget **widget**' | ||
| + |   widget.set_size_request(100, | ||
| + |   widget.set_size_request(-1, | ||
| + | |||
| + | , it won't expand at all, nothing will happen. This is an issue if you wanted to use this as a hack to resize the widget but let to the user the possibility to shrink it again; an hackish way to solve this is instead the following code: | ||
| + |   widget.set_size_request(100, | ||
| + |   gobject.idle_add(widget.set_size_request, | ||
| + | |||
| + | ====== gtk.ScrolledWindow ====== | ||
| + | While gtk.Containers usually propagate size requests from child(ren) to parent, gtk.ScrolledWindow doesn' | ||
| + |   * we have a widget that should take all the space available, but without overflowing the screen; if space isn't enough, and only in that case, the Scrollbar should appear. Notice that to reach that behaviour, we should also change gtk.Window behaviour so that its child(ren)' | ||
| + |   * we have a widget that should take all the space needed (even though not known precisely and then not hardcodeable) at startup, but its toplevel gtk.Window shouldn' | ||
| + | |||
| + | I solved this with the following code (**widget** is the widget we want to resize so that it is fully shown), thanks to //owen// in freenode.irc' | ||
| + |      | ||
| + | scrolledwindows = [] | ||
| + | scrolledwindows_policies = [] | ||
| + | scrolledwindows_hscrollbars = [] | ||
| + |      | ||
| + | while widget: | ||
| + |           # The ScrolledWindows stop propagation of queue_redraws, | ||
| + | # have the scrollbars disabled, so here we disable them... | ||
| + |           if gobject.type_is_a(widget, | ||
| + | scrolledwindows.append(widget) | ||
| + | scrolledwindows_policies.append(widget.get_policy()) | ||
| + |               widget.set_policy(gtk.POLICY_NEVER, | ||
| + | scrolledwindows_hscrollbars.append(widget.get_hscrollbar()) | ||
| + | widget = widget.get_parent() | ||
| + |    | ||
| + | toplevel = treeview.get_toplevel() | ||
| + |    | ||
| + | # ... then we can take the size... | ||
| + |    | ||
| + | new_width = toplevel.size_request()[0] | ||
| + |    | ||
| + | # ... add the size of bars... | ||
| + | bars_width = 0 | ||
| + |       for index in range(len(scrolledwindows)): | ||
| + | # (not needed if the policy hides it) | ||
| + |           if scrolledwindows_policies[index][0] == gtk.POLICY_ALWAYS: | ||
| + | bars_width += scrolledwindows_hscrollbars[index].size_request()[0] | ||
| + | scrolledwindows[index].set_policy(*scrolledwindows_policies[index]) | ||
| + |   #    print " | ||
| + |    | ||
| + | # ... and put together the total size. | ||
| + |    | ||
| + | new_width += bars_width | ||
pygtk/resizing.1231890128.txt.gz · Ultima modifica:  da pietro
                
                