gtk-perl Zugriff auf Menü

gtk-perl Zugriff auf Menü

am 04.01.2007 14:07:39 von guenter.moritz

Hallo an Alle,

ich habe mit Glade eine Oberfläche entworfen, in der unter Anderem ein
Menü vorhanden ist. Auf Teile dieses Menüs möchte ich nun zugreifen. Je
nachdem wie eine Abfrage ausfällt sollen Teile des Menüs deaktiviert werden.
Mein Programm sieht in etwa so aus:

#!/usr/bin/perl
##################################################
# Bilderverwaltung -- Gtk2 GUI
##################################################
use warnings;
use strict;

use Gtk2 -init;
use Gtk2::GladeXML;
use Glib;



# Load GUI XML description
my $g = Gtk2::GladeXML->new(
'bilderverwaltung.glade');

###
## globale Variable
###
my $w1 = $g->get_widget('wm1');
my $inPfad = $g->get_widget('inPfad');
my $statusbar = $g->get_widget('statusbar');
my $neu1 = $g->get_widget('neu1');
my $oeffnen1 = $g->get_widget('öffnen1');

### Menü-Teile
my $Bearbeiten = $g->get_widget('Bearbeiten');
my $Ansicht = $g->get_widget('Ansicht');
my $Hilfe = $g->get_widget('Hilfe');
my $Bilder = $g->get_widget('Bilder');
my $inPfad_Text;
print ("$Bearbeiten\n");

###
## Normale Variable
###
my $mysql_installed;


###
## Verbinden der Signale
###
$g->signal_autoconnect_all (
on_beenden_activate => 'beenden_activate',
on_einlesen1_activate => 'einlesen1_activate',
on_btCancel_clicked => 'btCanceld_clicked',
on_btOk_clicked => 'btOk_clicked'
);

###
## Prüfung, ob MySQL installiert ist
###
$mysql_installed = system("dpkg -l | grep mysql > erg.xxx");
if ($mysql_installed eq 256)
{
## Ausgabe in Statuszeile
print ("MySQL ist nicht installiert\n");

## Alle Menüeinträge deaktivieren, bis auf Datei/Beenden
menue_deaktivieren();
}
else
{
## Ausgabe in Statuszeile
print ("MySQL ist installiert\n");
}

# Enter main loop
Gtk2->main();

############################################################ #####

###
## Eigene Funktionen
###

[...]

sub menue_deaktivieren {
$Bearbeiten->_deselect();
}
############################################################ ####


Wenn ich nun das vollständige Programm starte bricht es mit den
folgenden Fehlermeldungen ab:

perl bilderverwaltung.pl
Use of uninitialized value in concatenation (.) or string at
bilderverwaltung.pl line 33.

MySQL ist nicht installiert
Can't call method "_deselect" on an undefined value at
bilderverwaltung.pl line 120.
############################################################ ###

Meine Frage an Euch, wie greife ich auf die entsprechenden Menü-Teile
(Sub-Menue, Item) zu und mit welcher Methode deaktiviere ich sie?

Welches Buch (in deutsch) könnt Ihr mir für Perl-Gtk empfehlen?

Ich habe schon eine Weile gegoogeld aber entweder habe ich die falschen
Stichworte benutzt oder ich habe den Wald vor lauter Bäumen nicht gesehen.

Danke für Eure Hilfe und Tipps.

MfG
Günter

Re: gtk-perl Zugriff auf Menü

am 05.01.2007 21:31:47 von Johannes Plunien

Hallo Guenter,

ich kenne deine XML Datei ja leider nicht, die deine GUI beschreibt.
Aber es macht den Anschein, als wuerde folgende Zuweisung nicht klappen:

> my $Bearbeiten = $g->get_widget('Bearbeiten');

Folgendes muesste Zeile Nummer 33 sein:

> print ("$Bearbeiten\n");

Die produziert naemlich diese Warnung:

> Use of uninitialized value in concatenation (.) or string at
> bilderverwaltung.pl line 33.

Was bedetet: $Bearbeiten ist undef. Da scheint wie gesagt dein
get_widget Aufruf nicht geklappt zu haben. Vermutlich gibt es keine Node
mit dem Namen 'Bearbeiten' in deiner XML Datei.

> Can't call method "_deselect" on an undefined value at
> bilderverwaltung.pl line 120.

Eigentlich erwartest du ja in $Bearbeiten eine Instanz von
Gtk2::MenuItem, damit du auf die Methode _deselect zugreifen kannst. Da
aber $Bearbeiten undef ist, stirbt dein Script hier. Woher hast du die
Idee mit _deselect eigentlich? Ich glaube nicht, dass sie den von dir
gewuenschten Effekt hervorrufen wird, ich kann die Methode nicht finden.

> Meine Frage an Euch, wie greife ich auf die entsprechenden Menü-Teile
> (Sub-Menue, Item) zu und mit welcher Methode deaktiviere ich sie?

Jetzt zu der schlechten Nachricht: Ich kann in der Dokumentation [1]
leider nichts Passendes finden, wie man so ein MenuItem deaktivieren
koennte. Aber: Ich bin nicht allwissend und vielleicht habe ich auch
etwas uebersehen. Vielleicht meldet sich ja noch jemand anderes :)

Was auch noch ganz interessant ist zum Thema: [2], [3]

....und natuerlich der Rest der API unter der URL [1]


[1] http://developer.gnome.org/doc/API/2.0/gtk/GtkMenuItem.html
[2] http://gtk2-perl.sourceforge.net/doc/gtk2-perl-tut/
[3] http://poe.perl.org/?POE_Cookbook/Gtk2_Counter_glade


--
Johannes Plunien | mailto:plu@pqpq.de | http://www.pqpq.de

Re: gtk-perl Zugriff auf Menü

am 06.01.2007 11:05:42 von Phil

Am Thu, 04 Jan 2007 14:07:39 +0100 schrieb Günter Moritz:

> Hallo an Alle,
>
> ich habe mit Glade eine Oberfläche entworfen, in der unter Anderem ein
> Menü vorhanden ist. Auf Teile dieses Menüs möchte ich nun zugreifen. Je
> nachdem wie eine Abfrage ausfällt sollen Teile des Menüs deaktiviert werden.

my $menuitem = $g->get_widget('menuitem_name');

menuitem_name muss der Name des Widgets und nicht die Beschriftung sein.

print ref($menuitem);

muss 'Gtk2::MenuItem' ausgeben

Gtk2::MenuItem erbt alle Eigenschaften von Gtk2::Widget, um es zu
deaktivieren, die property 'sensitive' auf FALSE (oder 0) setzen:

$menuitem->set('sensitive', FALSE);
wieder aktivieren:
$menuitem->set('sensitive', TRUE);

> Welches Buch (in deutsch) könnt Ihr mir für Perl-Gtk empfehlen?

Es gibt kein spezielles Perl-Gtk Buch, die Links die Johannes nannte sind
schon fast alles was es gibt und eigentlich auch ausreichend.

Ein Muss ist auf jedenfall die offizielle Gtk API Referenz, die kann
(und soll) man 1zu1 auf Perl-Gtk übertragen.


Grüße, Phil