Die Programmiersprache Ruby

Blog| Forum| Wiki  


RubyGem wxRuby
Entwickler: wxRuby Development Team
Aktuelle stabile Version: 2.0.1
Lizenz: wxRuby2 License
Gem-Install-Befehl: gem install wxruby-ruby19
require-Statement: require "wx"
Website: http://wxruby.rubyforge.org

wxRuby ist ein plattformübergreifendes GUI-Toolkit für Ruby. Es basiert auf der für viele Betriebssysteme (unter denen natürlich auch die drei Großen Windows, Linux und Mac sind) verfügbaren C++-Bibliothek wxWidgets und ist neben Tk und FxRuby eines der meistgenutzten GUI-Toolkits in Ruby.

Inhaltsverzeichnis

Warum wxRuby?

Die Vorteile von wxRuby gegenüber anderen Toolkits sind die folgenden:

  • Cross-Plattform. wxRuby läuft überall.
  • Natives Aussehen. wxWidgets benutzt wo immer möglich native GUI-Bausteine.
  • Recht rubyisches API. Vor einiger Zeit ist das API komplett umdesigned worden, sodass es sich jetzt gut benutzen lässt.
  • Ausführliche Dokumentation ( http://wxruby.rubyforge.org/doc/ )

Nachteile gibt es wie üblich natürlich auch:

  • British English - Klassen heißen da zum Beipsiel Colour und nicht Color.
  • C++ kommt manchmal durch - gelegentlich findet man noch Methoden, die unverändert aus C++ übernommen wurden.
  • Kein RDoc (aber die Online-Dokumentation lässt sich herunterladen)

Installation

wxRuby gibt es als Gem. Daher genügt ein einfaches

1
2
3
4
F��r Ruby 1.8
# gem install wxruby
F��r Ruby 1.9
# gem install wxruby-ruby19


Ubuntu 9.10 und neuer

Unter den neueren Ubuntu-Versionen (Karmic und neuer) kommt es beim Einbinden von wxRuby per require "wx" zu folgendem oder einem ähnlichen Fehler:

1
2
3
4
5
6
7
8
9
LoadError: /opt/rubies/ruby-1.9.1-p429/lib/ruby/gems/1.9.1/gems/
wxruby-ruby19-2.0.0-x86_64-linux/lib/wxruby2.so: symbol _ZN13wxAuiNotebook7SetFontERK6wxFont, 
version WXU_2.8.5 not defined in file libwx_gtk2u_aui-2.8.so.0 with link time reference - 
/opt/rubies/ruby-1.9.1-p429/lib/ruby/gems/1.9.1/gems/wxruby-ruby19-2.0.0-x86_64-linux/lib/wxruby2.so
        from /opt/rubies/ruby-1.9.1-p429/lib/ruby/gems/1.9.1/gems/wxruby-ruby19-2.0.0-x86_64-linux/lib/wx.rb:12:in `require'
        from /opt/rubies/ruby-1.9.1-p429/lib/ruby/gems/1.9.1/gems/wxruby-ruby19-2.0.0-x86_64-linux/lib/wx.rb:12:in `<top (required)>'
        from (irb):1:in `require'
        from (irb):1
        from /opt/rubies/ruby-1.9.1-p429/bin/irb:12:in `<main>'

Die genaue Ursache ist nicht bekannt, es gibt jedoch zwei mögliche Workarounds:

1. Nutzen des wxRuby-PPAs

wxRuby besitzt ein eigenes PPA für Ubuntu, das sich mit folgenden Befehlen leicht zu den eigenen Paketquellen hinzufügen lässt:

1
2
wget -q http://repo.trilake.net/apt/repo.gpg -O- | sudo apt-key add -
sudo wget http://repo.trilake.net/apt/sources.list.d/lucid.list -O/etc/apt/sources.list.d/trilake.list

Danach kann wxRuby wie folgt installiert werden:

1
2
sudo apt-get update
sudo apt-get install wxruby

Das PPA enthält momentan allerdings nur 32-Bit-Versionen von wxRuby. 64-Bit soll aber bald folgen.

2. Selbstkompilieren

Diese Option ist vor allem für die Leute interessant, die sich Ruby selbst kompiliert haben oder (momentan jedenfalls) eine 64-Bit-Distribution nutzen oder die spezielle Features wie das StyledTextControl verwenden wollen. Man geht dazu wie folgt vor (Quelle):

  1. g++ installieren: sudo apt-get install g++
  2. Installation der wxWidgets-Header: sudo apt-get install libwxgtk2.8-dev
  3. Installation der freeglut-Header: sudo apt-get install freeglut3-dev

wxRuby benötigt die Ruby-shared-Libary, um kompiliert werden zu können, d.h. das Ruby, mit dem man wxRuby kompilieren möchte, muss mit der Option --enable-shared kompiliert worden sein. Sollte das nicht der Fall sein, muss man sich ein neues Ruby kompilieren, etwa so:

1
2
3
$ ./configure --enable-shared --prefix=/opt/ruby
$ make
# make install


Denke bitte daran, dass Ruby wiederum eigene Abhängigkeiten hat, vor allem zlib1g-dev, libssl-dev und libreadline5-dev.

3. wxRuby benötigt SWIG zur Kompilierung, und zwar zwangsläufig in der Version 1.3.38 (Link siehe unten). SWIG lässt sich normalerweise direkt kompilieren, etwa so:

1
2
3
$ ./configure --prefix=/opt/swig
$ make
# make install


4. Sicherstellen, dass das neue Ruby und SWIG gefunden werden: export PATH=/opt/ruby/bin:/opt/swig/bin:$PATH
5. wxRuby kompilieren (das dauert seeeehr lange, bei mir (Intel Core2Duo 2-Kern mit 2Ghz pro Prozessor) ca. eine halbe Stunde):

1
2
$ rake
$ rake gem


6. Das Gem ist fertig. Du kannst es jetzt irgendwo installieren (achte darauf, das richtige Ruby zu verwenden, wenn du das mit --enable-shared kompilierte nur zum Kompilieren benutzen willst), achte aber darauf, gem die --local-Option mitzugeben:

# gem install ./wxruby-ruby19-2.0.1-x86_64-linux.gem --local


Das aktuelle Ruby kannst du von http://www.ruby-lang.org herunterladen, den Quellcode von wxRuby findest du auf RubyForge. Hier die Direktlinks für Faule (können nicht mehr aktuell sein, wenn dieser Artikel längere Zeit nicht mehr aktualisiert wurde):

Visual Styles unter Windows

Häufig sieht das Design von GUIs, die mit wxRuby erstellt worden, unter Windows etwas altbacken aus. Das kann man aber ändern (Quelle): Erstelle zwei Dateien mit den Namen ruby.exe.manifest und rubyw.exe.manifest im bin/-Ordner von Ruby (stelle sicher, dass die Dateiendung wirklich .manifest ist, nicht ein verkapptes .txt dahinter!). Kopiere das folgende XML-Dokument in diese Dateien hinein:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity version="1.8.6.0" processorArchitecture="X86" 
        name="Microsoft.Winweb.Ruby" type="win32"/>
        <description>Ruby interpreter</description>
        <dependency>
         <dependentAssembly>
                <assemblyIdentity 
                    type="win32" 
                    name="Microsoft.Windows.Common-Controls" 
                    version="6.0.0.0" 
                    processorArchitecture="X86" 
                    publicKeyToken="6595b64144ccf1df" 
                    language="*"
                />
        </dependentAssembly>
    </dependency>
</assembly>

Anschließend ändere den String, der bei Version steht (also 1.8.6.0) auf deine verwendete Ruby-Version, also etwa 1.9.1.0 (die 0 am Ende bleibt immer erhalten). Danach sollten deine GUIs modern aussehen.

Solltest du deine Skripte mit OCRA deployen, dann solltest du zumindest du rubyw.exe.manifest-Datei miteinbinden. OCRA bietet dazu die --dll-Option.

Aber es geht trotzdem nicht?

Hin und wieder kommt es trotz Manifest-Datei zu dem Problem, dass die GUI nicht modern aussehen will. Meist hilft es dann, rubyw.exe auf Kompatibilitätsmodus für Windows XP zu schalten, ein GUI-Skript auszuführen, und danach den Kompatibiliätsmodus wieder abzuschalten (das sollte für ruby.exe genauso gelten). Der Grund für dieses Mysterium ist allerdings unbekannt. Das Problem ist noch nie im Zusammenhang mit einer von OCRA kompilierten Executable aufgetreten.

wxRuby verwenden

Ein einfaches Hallo-Welt-Programm sieht so aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
require "rubygems" #Wenn Ruby 1.8 verwendet wird
require "wx" #wxRuby einbinden

class HelloFrame < Wx::Frame
  include Wx #Damit man sich st��ndige Wx:: spart
  
  def initialize(parent = nil)
    super(parent, :size => Size.new(400, 400), :title => "Hallihallo") #Eigentliches Erzeugen
    self.background_colour = NULL_COLOUR #Ohne wird der Hintergrund gelegentlich sehr grau
    
    #Jetzt folgen die Controls
    StaticText.new(self, :label => "Das ist meine erste wxRuby-Anwendung!", :pos => Point.new(20, 20))
    StaticText.new(self, :label => "Sie sagt: Hallo, Welt!", :pos => Point.new(20, 50))
  end
  
end

class HelloApp < Wx::App
  include Wx
  
  def on_init #Diese Methode wird immer bei Aktivierung der GUI aufgerufen
    @mainwindow = HelloFrame.new #Erzeugen des Fensters
    @mainwindow.show #Anzeigen des Fensters
  end
  
end

x = HelloApp.new
x.main_loop #Startet die Hauptschleife der GUI


Siehe auch