Einer der meistgenutzten Layoutmanager ist pack.
Wird ohne nähere Angaben gepackt, stapelt Tk die
Widgets mittig zentriert übereinander (Abb. 29.2):
require 'tk'
root= TkRoot.new { title "pack Beispiel" }
TkLabel.new(root) {
text "Automatisches Layout"
pack
}
% Alternative Syntax:
TkCheckButton.new(root, text => "schön").pack
TkCheckButton.new(root, text => "schrecklich").pack
TkButton.new(root) {
text "Ende"
command proc { exit }
pack
}
Tk.mainloop
Hilfestellungen für den Layoutmanager lohnen sich, wie Abb. 29.3 zeigt:
#!/usr/local/bin/ruby
require 'tk'
root= TkRoot.new { title "pack Beispiel 2" }
TkLabel.new(root) {
text "Mit Anleitung gepackt"
pack
}
TkButton.new(root) {
text "Ende"
command proc { exit }
pack('side' => 'bottom', 'expand' => 1,
'fill'=> "x")
}
TkCheckButton.new(root) {
text "schön"
pack('side' => 'left', 'expand' => 1)
}
TkCheckButton.new(root) {
text "schrecklich"
pack('side' => 'right', 'expand' => 1)
}
Tk.mainloop
Man kann die Optionsnamen bei den Tk-Methoden
auch per Symbol benennen, zum Beispiel: pack(:side => 'bottom').
Rollbalken (Abb. 29.4) müssen mit ihren Bezugs-Widgets manuell verbunden werden, damit sie ihre Anzeigen gegenseitig aktualisieren beziehungsweise beeinflussen können. Die Rollprozedur des Balkens verweist auf das Listenobjekt und das Listenobjekt verweist in seiner Rollprozedur auf den zugehörigen Rollbalken.
require "tk"
scroll = list = nil
list = TkListbox.new {
yscroll proc{ |*idx| scroll.set(*idx) }
width 20; height 16
setgrid 1
pack('side' => 'left', 'fill' => 'y',
'expand' => 1)
}
scroll = TkScrollbar.new {
command proc{ |*idx| list.yview(*idx) }
pack('side' => 'left', 'fill' => 'y',
'expand' => 1)
}
for f in Dir.glob("*")
list.insert 'end', f
end
Tk.mainloop
Auf einem Canvas kann man beliebige Grafiken zeichnen, im Beispiel (Abb. 29.5) wird ein Rechteck mit Schatten erzeugt und auf den Canvas gepackt.
require "tk" canvas = TkCanvas.new TkcRectangle.new(canvas, '0.6c', '0.4c', '2.6c', '1.4c', 'outline' => 'blue', 'fill' => 'blue') TkcRectangle.new(canvas, '0.5c', '0.3c', '2.5c', '1.3c', 'outline' => 'yellow', 'fill' => 'yellow') canvas.pack Tk.mainloop
Mit configure können Eigenschaften von Widgets
während der Laufzeit beeinflusst werden. Im Beispiel
(Abb.29.6) ändert sich die Fokusfarbe nach dem Klicken.
require "tk"
$button = TkButton.new {
text 'Hello World!'
command proc {
$button.configure('activebackground', 'red')
}
pack
}
Tk.mainloop
Wie in den meisten Umgebungen, in denen Fenster aus Quelltext erzeugt werden, ist die Definition von Menüs (Abb. 29.7) eine wortreiche Angelegenheit.
require "tk"
mbar = TkFrame.new {
relief 'raised'; borderwidth 2
pack('fill' => 'x')
}
TkMenubutton.new(mbar) { |mb|
text "Datei"; underline 0
menu TkMenu.new(mb) {
add 'command', 'label' => 'Ende',
'underline' => 0,
'command' => proc { exit }
}
pack('side' => 'left', 'padx' => '1m')
}
TkMenubutton.new(mbar) { |mb|
text "Hilfe"; underline 0
menu TkMenu.new(mb) {
add 'command', 'label' => 'Über uns',
'underline' => 0, 'command' => proc {
print "Es waren einmal drei " +
"kleine Rubyholics ..."
}
}
pack('side' => 'left', 'padx' => '1m')
}
Tk.mainloop
[RubyTk] enthält Antworten auf häufig gestellte Fragen zu RubyTk.