Ralph,
I have done something like this
for the same reasons... it seems
that the draw area bombs at about
32k width, so I made my own virtually
infinite scroll window: a draw area
and a vscroll bar in a table, with
the draw area responding to
"value-changed" signal of the
scrollbars adjustment. It looks
just like the scrolled window.
Code attached (see Graph class).
Ralph Walden wrote:
> List,
>
> I have a need for a window frame with scrollbars, and am currently
> abusing the GtkScrolledWindow for this purpose, but I
> monitor the scrollbar adjustments myself and do my own scrolling of
> (practically) infinite data. But of course, when I add a child to
> the ScrolledWindow with .add instead of .add_with_viewport, I get
> the usual nasty Gtk Warning:
>
> Gtk-WARNING **: gtk_scrolled_window_add(): cannot add non scrollable
> widget use gtk_scrolled_window_add_with_viewport() instead
>
> I'd like to eliminate this warning. I thought about creating my own
> window
> with scrollbars, but haven't thought of a good way of makinging it look
> or work like the GtkScrolledWindow (from python).
>
> Any suggestions?
>
>
> Thanks,
>
class Graph(GtkTable):
def __init__(self,data):
GtkTable.__init__(self,3,3)
self.data=data
self.set_border_width(10)
self.hrule=GtkHRuler()
self.attach(self.hrule,1,2,0,1,FILL | EXPAND,0)
self.hrule.show()
self.draw=GtkDrawingArea()
#self.draw.size(min(len(self.data),300),200)
self.draw.connect("expose_event",self.expose_event)
self.draw.connect("configure_event",self.configure_event)
self.attach(self.draw,1,2,1,2)
self.draw.show()
#self.hscale=GtkHScale()
self.hscroll=GtkHScrollbar()
self.adj=self.hscroll.get_adjustment()
self.adj.set_all(0,0,0,1,1,1)
self.adj.connect("value_changed",self.adj_value_changed)
self.attach(self.hscroll,1,2,2,3,FILL | EXPAND,0)
self.hscroll.show()
self.show()
self.connect("key_release_event",self.key_release)
def get_data(self):
self.data.update()
return self.data[
int(self.adj.value):int(self.adj.value)+self.get_window().width]
def expose_event(self,widget,event):
#print fname()
area=event.area
widget=self.draw
gc=widget.get_style().fg_gc[STATE_NORMAL]
win=widget.get_window()
widget.draw_rectangle(widget.get_style().black_gc,TRUE,
0,0,win.width,win.height)
x=1
data=self.get_data()
_y=data[0]
for y in data:
if x >= len(data):
break
widget.draw_line(
widget.get_style().white_gc,
x-1, widget.get_window().height*(1.0-_y),
x, widget.get_window().height*(1.0-y) )
_y=y
x=x+1
#print "expose_event",self,widget,event
#print "window : ",dir(widget.get_window())
return FALSE
def configure_event(self,widget,event):
width=self.get_window().width
self.adj.set_all(self.adj.value,0,len(self.data)-width,10,width,width)
self.hrule.set_range(self.adj.value,self.adj.value+width-1,
self.adj.value,self.adj.value+width-1)
def adj_value_changed(self,adj):
#print adj.value
self.draw.draw([0,0,200,200])
width=self.get_window().width
self.hrule.set_range(self.adj.value,self.adj.value+width-1,
self.adj.value,self.adj.value+width-1)
def key_release(self,event,data):
print "key_release",event,data
class TopWin(GtkWindow):
def __init__(self):
GtkWindow.__init__(self)
self.set_default_size(600,300)
self.set_uposition(20,20)
self.connect("destroy",mainquit)
self.connect("key_release_event",self.key_release)
self.show()
def key_release(self,event,data):
print event,data