next up previous contents index
Search Next: FXRuby Up: RubyTk Previous: Konzept   Contents   Index

Beispiele

Die Darstellung der einzelnen Widgets übernehmen so genannte Layoutmanager. Diese legen auch die Positionen der Widgets und ihre Größen fest. Dazu kommunizieren sie auch mit den Widgets und fragen diese zum Beispiel nach ihrer Mindestgröße oder anderen Wünschen. Der Layoutmanager behält jedoch das letzte Wort.

Einer der meistgenutzten Layoutmanager ist pack. Wird ohne nähere Angaben gepackt, stapelt Tk die Widgets mittig zentriert übereinander (Abb. 29.2):

Figure 29.2: Ohne Optionen wird mittig gestapelt
\includegraphics[]{images/rubytk_packbad.eps}

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:

Figure 29.3: Dynamische Layoutgestaltung
\includegraphics[]{images/rubytk_packgood.eps}

#!/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.

Figure 29.4: Rollbalken
\includegraphics[]{images/rubytk_scrollbar.eps}

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.

Figure 29.5: Bezugspunkt beim Canvas ist links oben
\includegraphics[]{images/rubytk_canvas.eps}

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

Figure 29.6: Von links nach rechts: vorher mit Fokus, normal, nach Klick mit anderer Fokusfarbe
\includegraphics[]{images/rubytk_configure.eps}

Wie in den meisten Umgebungen, in denen Fenster aus Quelltext erzeugt werden, ist die Definition von Menüs (Abb. 29.7) eine wortreiche Angelegenheit.

Figure: Abreißbare Menüs
\includegraphics[]{images/rubytk_menu.eps}

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.


next up previous contents index
Search Next: FXRuby Up: RubyTk Previous: Konzept   Contents   Index
(C) 2002 by dpunkt.de, Armin Roehrl, Stefan Schmiedl, Clemens Wyss 2002-01-20