From: Forrest C. [email protected]
Subject: [tk] Equivalent to Perl’s Tk::Tiler?
Date: Tue, 6 Dec 2005 02:17:33 +0900
Message-ID: [email protected]
I making arbitrarily large forms and in doing similar in Perl, I’ve
used Tk::Tiler, a scrollable frame. I’d just pack my various entries
into the form, and set a max size, from which the form would
automatically scroll if the contents were larger than the form size.
I’ve found a scrollable canvas sample I could use, but worry about the
of resources it might take up. Any pointers?
I don’t know Perl’s Tk::Tiler. Is it the one like the following?
scrframe.rb
require ‘tk’
class Tk::ScrollFrame < TkFrame
include TkComposite
DEFAULT_WIDTH = 200
DEFAULT_HEIGHT = 200
def initialize_composite(keys={})
@frame.configure(:width=>DEFAULT_WIDTH, :height=>DEFAULT_HEIGHT)
# create scrollbars
@v_scroll = TkScrollbar.new(@frame, 'orient'=>'vertical')
@h_scroll = TkScrollbar.new(@frame, 'orient'=>'horizontal')
# create a canvas widget
@canvas = TkCanvas.new(@frame)
# allignment
TkGrid.rowconfigure(@frame, 0, 'weight'=>1, 'minsize'=>0)
TkGrid.columnconfigure(@frame, 0, 'weight'=>1, 'minsize'=>0)
@canvas.grid('row'=>0, 'column'=>0, 'sticky'=>'news')
@frame.grid_propagate(false)
# assign scrollbars
@canvas.xscrollbar(@h_scroll)
@canvas.yscrollbar(@v_scroll)
# scrollbars ON
vscroll(keys.delete('vscroll'){true})
hscroll(keys.delete('hscroll'){true})
# create base frame
@base = TkFrame.new(@canvas)
# embed base frame
@cwin = TkcWindow.new(@canvas, [0, 0], :window=>@base,
:anchor=>‘nw’)
@canvas.scrollregion(@cwin.bbox)
# binding to reset scrollregion
@base.bind('Configure'){ @canvas.scrollregion(@cwin.bbox) }
# set default receiver of method calls
@path = @base.path
# please check the differences of the following definitions
option_methods(
:scrollbarwidth
)
# set receiver widgets for configure methods (with alias)
delegate_alias('scrollbarrelief', 'relief', @h_scroll, @v_scroll)
# set receiver widgets for configure methods
delegate('DEFAULT', @base)
delegate('background', @frame, @base, @canvas, @h_scroll, @v_scroll)
delegate('width', @frame)
delegate('height', @frame)
delegate('activebackground', @h_scroll, @v_scroll)
delegate('troughcolor', @h_scroll, @v_scroll)
delegate('repeatdelay', @h_scroll, @v_scroll)
delegate('repeatinterval', @h_scroll, @v_scroll)
delegate('borderwidth', @frame)
delegate('relief', @frame)
# do configure
configure keys unless keys.empty?
end
forbid to change binding of @base frame
def bind(*args)
@frame.bind(*args)
end
def bind_append(*args)
@frame.bind_append(*args)
end
def bind_remove(*args)
@frame.bind_remove(*args)
end
def bindinfo(*args)
@frame.bindinfo(*args)
end
set width of scrollbar
def scrollbarwidth(width = nil)
if width
@h_scroll.width(width)
@v_scroll.width(width)
else
@h_scroll.width
end
end
vertical scrollbar : ON/OFF
def vscroll(mode)
st = TkGrid.info(@v_scroll)
if mode && st.size == 0 then
@v_scroll.grid(‘row’=>0, ‘column’=>1, ‘sticky’=>‘ns’)
elsif !mode && st.size != 0 then
@v_scroll.ungrid
end
self
end
horizontal scrollbar : ON/OFF
def hscroll(mode)
st = TkGrid.info(@h_scroll)
if mode && st.size == 0 then
@h_scroll.grid(‘row’=>1, ‘column’=>0, ‘sticky’=>‘ew’)
elsif !mode && st.size != 0 then
@h_scroll.ungrid
end
self
end
end
test
if FILE == $0
f = Tk::ScrollFrame.new(:scrollbarwidth=>10, :width=>300,
:height=>200)
f.pack(:expand=>true, :fill=>:both)
TkButton.new(f, :text=>‘foo bar button’, :command=>proc{puts ‘foo
bar’}).pack
Tk.after(3000){TkText.new(f).pack(:expand=>true, :fill=>:both)}
Tk.mainloop
end