Perl Tk: mehrere Dialogboxen von Mainwindow Steuern
Perl Tk: mehrere Dialogboxen von Mainwindow Steuern
am 25.07.2007 09:23:11 von doleman
Hallo, ich habe folgendes Problem: Wenn ich mehr als eine von
Tk:toplevel abgeleitetes Widget mit einer waitVariable erstelle kann
ich nur das zuletzt erstellte von MainWindow aus steuern, d.h es
reagiert nur das zuletzt Konstruierte widget auf Befehle (z.B. Knopf
drücken). Ist es möglich mehrere Widgets gleichzeitig zu Steuern?
Der Nachfolgende Code veranschaulicht das Problem:
Wenn man auf dem Saisir.... drückt wird ein Widget mit einen EntryBox
erstellt der eingegeben Text wird durch Valider auf die Konsole
ausgegeben und das widget geschlossen.
Wenn ich nun 2 mal auf Saisir.... klicke dann werden 2 Widgets
erstellt ich kann allerdings nur die zuletzt erstellte Steueren. d.h.
die zuerst erstellte reagiert nicht auf drücken des Buttons.
Hat irgendjemand eine idee wie man das Problem lösen könnte?`danke
#main.pl
use Tk;
use WidgetSaisie;
sub Commande {
my ( $fille, $chaine );
$fille =3D $fenetre->WidgetSaisie();
$chaine =3D $fille->Show();
print "$chaine\n";
}
# Main
$fenetre =3D new MainWindow();
$fenetre->title('TestSaisie');
$fenetre->Button(
-text =3D> "Saisir...",
-command =3D> \&Commande
)->pack( -padx =3D> 2, -pady =3D> 2 );
MainLoop();
#Datei WidgetSaisie.pm
package WidgetSaisie;
use base qw ( Tk::Toplevel ); # widget composite de type Toplevel
Construct Tk::Widget 'WidgetSaisie';
sub Populate {
my ( $this, $args ) =3D @_;
my ( $bouton, $zone_saisie );
$this->SUPER::Populate($args);
$this->{'texte'} =3D '';
$this->{'bouton'} =3D '';
$this->transient( $this->Parent->toplevel );
$this->withdraw();
$this->protocol( 'WM_DELETE_WINDOW' =3D> sub { } );
$zone_saisie =3D $this->Entry( -textvariable =3D> \$this-
>{'texte'} );
$zone_saisie->pack( -padx =3D> 2, -pady =3D> 2 );
$bouton =3D $this->Button(
-text =3D> 'Valider',
-command =3D> sub {
$this->{'bouton'} =3D 'Ok';
}
);
$bouton->pack( -padx =3D> 2, -pady =3D> 2 );
}
sub Wait {
my ($this) =3D @_;
$this->waitVariable( \$this->{'bouton'} );
$this->grabRelease();
$this->withdraw();
}
sub Show {
my ($this) =3D @_;
my ( $of, $og );
$of =3D $this->focusSave;
$og =3D $this->grabSave;
$this->Popup();
#$this->grab();
$this->focus();
$this->Wait();
$of->();
$og->();
return $this->{'texte'};
}
1;
Re: Perl Tk: mehrere Dialogboxen von Mainwindow Steuern
am 28.07.2007 15:44:02 von Slaven Rezic
doleman writes:
> Hallo, ich habe folgendes Problem: Wenn ich mehr als eine von
> Tk:toplevel abgeleitetes Widget mit einer waitVariable erstelle kann
> ich nur das zuletzt erstellte von MainWindow aus steuern, d.h es
> reagiert nur das zuletzt Konstruierte widget auf Befehle (z.B. Knopf
> drücken). Ist es möglich mehrere Widgets gleichzeitig zu Steuern?
> Der Nachfolgende Code veranschaulicht das Problem:
> Wenn man auf dem Saisir.... drückt wird ein Widget mit einen EntryBox
> erstellt der eingegeben Text wird durch Valider auf die Konsole
> ausgegeben und das widget geschlossen.
> Wenn ich nun 2 mal auf Saisir.... klicke dann werden 2 Widgets
> erstellt ich kann allerdings nur die zuletzt erstellte Steueren. d.h.
> die zuerst erstellte reagiert nicht auf drücken des Buttons.
> Hat irgendjemand eine idee wie man das Problem lösen könnte?`danke
>
Es sieht tatsächlich so aus, als ob verschachtelte
waitVariable-Aufrufe nicht funktionieren. Aber brauchst du
waitVariable überhaupt? Normalerweise benutzt man waitVariable, wenn
man die GUI (scheinweise) blockieren möchte. Du möchtest aber
anscheinend, dass man weiterhin den Button im Hauptfenster anklicken
kann. Könntest du nicht mit einfachen Callbacks arbeiten?
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
babybike - routeplanner for cyclists in Berlin
handheld (e.g. Compaq iPAQ with Linux) version of bbbike
http://bbbike.sourceforge.net
Re: Perl Tk: mehrere Dialogboxen von Mainwindow Steuern
am 29.07.2007 15:16:06 von doleman
On 28 Jul., 15:44, Slaven Rezic wrote:
> doleman writes:
> > Hallo, ich habe folgendes Problem: Wenn ich mehr als eine von
> > Tk:toplevel abgeleitetes Widget mit einer waitVariable erstelle kann
> > ich nur das zuletzt erstellte von MainWindow aus steuern, d.h es
> > reagiert nur das zuletzt Konstruierte widget auf Befehle (z.B. Knopf
> > drücken). Ist es möglich mehrere Widgets gleichzeitig zu Steuern?
> > Der Nachfolgende Code veranschaulicht das Problem:
> > Wenn man auf dem Saisir.... drückt wird ein Widget mit einen EntryBox
> > erstellt der eingegeben Text wird durch Valider auf die Konsole
> > ausgegeben und das widget geschlossen.
> > Wenn ich nun 2 mal auf Saisir.... klicke dann werden 2 Widgets
> > erstellt ich kann allerdings nur die zuletzt erstellte Steueren. d.h.
> > die zuerst erstellte reagiert nicht auf drücken des Buttons.
> > Hat irgendjemand eine idee wie man das Problem lösen könnte?`danke
>
> Es sieht tatsächlich so aus, als ob verschachtelte
> waitVariable-Aufrufe nicht funktionieren. Aber brauchst du
> waitVariable überhaupt? Normalerweise benutzt man waitVariable, wenn
> man die GUI (scheinweise) blockieren möchte. Du möchtest aber
> anscheinend, dass man weiterhin den Button im Hauptfenster anklicken
> kann. Könntest du nicht mit einfachen Callbacks arbeiten?
>
> Gruß,
> Slaven
>
> --
> Slaven Rezic - slaven rezic de
> babybike - routeplanner for cyclists in Berlin
> handheld (e.g. Compaq iPAQ with Linux) version of bbbike
> http://bbbike.sourceforge.net
Callbacks sind eine gute Idee. Leider habe ich bisher nur mit wait-
Variablen erfahrung. Gibt es irgendwo ein Beispiel wie man sowas mit
Callbacks realisieren kann?
danke
gruß
Andrei
Re: Perl Tk: mehrere Dialogboxen von Mainwindow Steuern
am 29.07.2007 20:17:24 von Slaven Rezic
doleman writes:
> On 28 Jul., 15:44, Slaven Rezic wrote:
> > doleman writes:
> > > Hallo, ich habe folgendes Problem: Wenn ich mehr als eine von
> > > Tk:toplevel abgeleitetes Widget mit einer waitVariable erstelle kann
> > > ich nur das zuletzt erstellte von MainWindow aus steuern, d.h es
> > > reagiert nur das zuletzt Konstruierte widget auf Befehle (z.B. Knopf
> > > drücken). Ist es möglich mehrere Widgets gleichzeitig zu Steuern?
> > > Der Nachfolgende Code veranschaulicht das Problem:
> > > Wenn man auf dem Saisir.... drückt wird ein Widget mit einen EntryBox
> > > erstellt der eingegeben Text wird durch Valider auf die Konsole
> > > ausgegeben und das widget geschlossen.
> > > Wenn ich nun 2 mal auf Saisir.... klicke dann werden 2 Widgets
> > > erstellt ich kann allerdings nur die zuletzt erstellte Steueren. d.h.
> > > die zuerst erstellte reagiert nicht auf drücken des Buttons.
> > > Hat irgendjemand eine idee wie man das Problem lösen könnte?`danke
> >
> > Es sieht tatsächlich so aus, als ob verschachtelte
> > waitVariable-Aufrufe nicht funktionieren. Aber brauchst du
> > waitVariable überhaupt? Normalerweise benutzt man waitVariable, wenn
> > man die GUI (scheinweise) blockieren möchte. Du möchtest aber
> > anscheinend, dass man weiterhin den Button im Hauptfenster anklicken
> > kann. Könntest du nicht mit einfachen Callbacks arbeiten?
> >
> > Gruß,
> > Slaven
> >
> > --
> > Slaven Rezic - slaven rezic de
> > babybike - routeplanner for cyclists in Berlin
> > handheld (e.g. Compaq iPAQ with Linux) version of bbbike
> > http://bbbike.sourceforge.net
>
> Callbacks sind eine gute Idee. Leider habe ich bisher nur mit wait-
> Variablen erfahrung. Gibt es irgendwo ein Beispiel wie man sowas mit
> Callbacks realisieren kann?
>
Du benutzt in deinem Skript bereits einen Callback, aber dieser setzt
nur die Variable, um waitVariable() aufzuheben. Du müsstest also den
Code, der nach Wait() ausgeführt werden soll, in diesen Callback
ausführen lassen.
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
tknotes - A knotes clone, written in Perl/Tk.
http://ptktools.sourceforge.net/#tknotes
Re: Perl Tk: mehrere Dialogboxen von Mainwindow Steuern
am 30.07.2007 00:52:49 von doleman
On 29 Jul., 20:17, Slaven Rezic wrote:
> doleman writes:
> > On 28 Jul., 15:44, Slaven Rezic wrote:
> > > doleman writes:
> > > > Hallo, ich habe folgendes Problem: Wenn ich mehr als eine von
> > > > Tk:toplevel abgeleitetes Widget mit einer waitVariable erstelle kann
> > > > ich nur das zuletzt erstellte von MainWindow aus steuern, d.h es
> > > > reagiert nur das zuletzt Konstruierte widget auf Befehle (z.B. Knopf
> > > > drücken). Ist es möglich mehrere Widgets gleichzeitig zu Steuer=
n?
> > > > Der Nachfolgende Code veranschaulicht das Problem:
> > > > Wenn man auf dem Saisir.... drückt wird ein Widget mit einen Entr=
yBox
> > > > erstellt der eingegeben Text wird durch Valider auf die Konsole
> > > > ausgegeben und das widget geschlossen.
> > > > Wenn ich nun 2 mal auf Saisir.... klicke dann werden 2 Widgets
> > > > erstellt ich kann allerdings nur die zuletzt erstellte Steueren. d.=
h
> > > > die zuerst erstellte reagiert nicht auf drücken des Buttons.
> > > > Hat irgendjemand eine idee wie man das Problem lösen könnte?`da=
nke
>
> > > Es sieht tatsächlich so aus, als ob verschachtelte
> > > waitVariable-Aufrufe nicht funktionieren. Aber brauchst du
> > > waitVariable überhaupt? Normalerweise benutzt man waitVariable, wenn
> > > man die GUI (scheinweise) blockieren möchte. Du möchtest aber
> > > anscheinend, dass man weiterhin den Button im Hauptfenster anklicken
> > > kann. Könntest du nicht mit einfachen Callbacks arbeiten?
>
> > > Gruß,
> > > Slaven
>
> > > --
> > > Slaven Rezic - slaven rezic de
> > > babybike - routeplanner for cyclists in Berlin
> > > handheld (e.g. Compaq iPAQ with Linux) version of bbbi=
ke
> > > http://bbbike.sourceforge.net
>
> > Callbacks sind eine gute Idee. Leider habe ich bisher nur mit wait-
> > Variablen erfahrung. Gibt es irgendwo ein Beispiel wie man sowas mit
> > Callbacks realisieren kann?
>
> Du benutzt in deinem Skript bereits einen Callback, aber dieser setzt
> nur die Variable, um waitVariable() aufzuheben. Du müsstest also den
> Code, der nach Wait() ausgeführt werden soll, in diesen Callback
> ausführen lassen.
>
> Gruß,
> Slaven
>
> --
> Slaven Rezic - slaven rezic de
>
> tknotes - A knotes clone, written in Perl/Tk.
> http://ptktools.sourceforge.net/#tknotes
Naja das ist schon klar ich könnte ja einfach im Button (-command)
alles nach wait ausführen. Es gibt da nur ein kleines Problem:
Ich will ja etwas per return an Mainwindow übergeben...in dem
vereinfachten Beispiel ist es eine Variable in mein Script ist es ein
Hash, das wird dann als return-Wert von show() an Mainwindow
übergeben. Da komm ich aber dann nicht mehr hin.....
Man kann auch in Populate mit ConfigSpecs callbacks erstellen den
dann wenn der Button gedrückt wird setzen und dadurch am Mainwindow
übergeben. Würde das Funktionieren?
gruß
Andrei
Re: Perl Tk: mehrere Dialogboxen von Mainwindow Steuern
am 30.07.2007 21:21:22 von Slaven Rezic
doleman writes:
> On 29 Jul., 20:17, Slaven Rezic wrote:
> > doleman writes:
> > > On 28 Jul., 15:44, Slaven Rezic wrote:
> > > > doleman writes:
> > > > > Hallo, ich habe folgendes Problem: Wenn ich mehr als eine von
> > > > > Tk:toplevel abgeleitetes Widget mit einer waitVariable erstelle kann
> > > > > ich nur das zuletzt erstellte von MainWindow aus steuern, d.h es
> > > > > reagiert nur das zuletzt Konstruierte widget auf Befehle (z.B. Knopf
> > > > > drücken). Ist es möglich mehrere Widgets gleichzeitig zu Steuern?
> > > > > Der Nachfolgende Code veranschaulicht das Problem:
> > > > > Wenn man auf dem Saisir.... drückt wird ein Widget mit einen EntryBox
> > > > > erstellt der eingegeben Text wird durch Valider auf die Konsole
> > > > > ausgegeben und das widget geschlossen.
> > > > > Wenn ich nun 2 mal auf Saisir.... klicke dann werden 2 Widgets
> > > > > erstellt ich kann allerdings nur die zuletzt erstellte Steueren. d.h.
> > > > > die zuerst erstellte reagiert nicht auf drücken des Buttons.
> > > > > Hat irgendjemand eine idee wie man das Problem lösen könnte?`danke
> >
> > > > Es sieht tatsächlich so aus, als ob verschachtelte
> > > > waitVariable-Aufrufe nicht funktionieren. Aber brauchst du
> > > > waitVariable überhaupt? Normalerweise benutzt man waitVariable, wenn
> > > > man die GUI (scheinweise) blockieren möchte. Du möchtest aber
> > > > anscheinend, dass man weiterhin den Button im Hauptfenster anklicken
> > > > kann. Könntest du nicht mit einfachen Callbacks arbeiten?
> >
> > > > Gruß,
> > > > Slaven
> >
> > > > --
> > > > Slaven Rezic - slaven rezic de
> > > > babybike - routeplanner for cyclists in Berlin
> > > > handheld (e.g. Compaq iPAQ with Linux) version of bbbike
> > > > http://bbbike.sourceforge.net
> >
> > > Callbacks sind eine gute Idee. Leider habe ich bisher nur mit wait-
> > > Variablen erfahrung. Gibt es irgendwo ein Beispiel wie man sowas mit
> > > Callbacks realisieren kann?
> >
> > Du benutzt in deinem Skript bereits einen Callback, aber dieser setzt
> > nur die Variable, um waitVariable() aufzuheben. Du müsstest also den
> > Code, der nach Wait() ausgeführt werden soll, in diesen Callback
> > ausführen lassen.
> >
> > Gruß,
> > Slaven
> >
> > --
> > Slaven Rezic - slaven rezic de
> >
> > tknotes - A knotes clone, written in Perl/Tk.
> > http://ptktools.sourceforge.net/#tknotes
>
> Naja das ist schon klar ich könnte ja einfach im Button (-command)
> alles nach wait ausführen. Es gibt da nur ein kleines Problem:
> Ich will ja etwas per return an Mainwindow übergeben...in dem
> vereinfachten Beispiel ist es eine Variable in mein Script ist es ein
> Hash, das wird dann als return-Wert von show() an Mainwindow
> übergeben. Da komm ich aber dann nicht mehr hin.....
Du denkst noch immer linear, aber bei GUI-Programmierung musst du
event-basiert denken.
> Man kann auch in Populate mit ConfigSpecs callbacks erstellen den
> dann wenn der Button gedrückt wird setzen und dadurch am Mainwindow
> übergeben. Würde das Funktionieren?
Das hört sich schon viel besser an. Ich störe mich noch am Begriff "am
Mainwindow übergeben". Das MainWindow ist ein Objekt und keine
Funktion, der man etwas übergeben könnte.
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
tkruler - Perl/Tk program for measuring screen distances
http://ptktools.sourceforge.net/#tkruler
Re: Perl Tk: mehrere Dialogboxen von Mainwindow Steuern
am 31.07.2007 09:56:30 von doleman
On 30 Jul., 21:21, Slaven Rezic wrote:
> doleman writes:
> > On 29 Jul., 20:17, Slaven Rezic wrote:
> > > doleman writes:
> > > > On 28 Jul., 15:44, Slaven Rezic wrote:
> > > > > doleman writes:
> > > > > > Hallo, ich habe folgendes Problem: Wenn ich mehr als eine von
> > > > > > Tk:toplevel abgeleitetes Widget mit einer waitVariable erstelle=
kann
> > > > > > ich nur das zuletzt erstellte von MainWindow aus steuern, d.h es
> > > > > > reagiert nur das zuletzt Konstruierte widget auf Befehle (z.B. =
Knopf
> > > > > > drücken). Ist es möglich mehrere Widgets gleichzeitig zu St=
euern?
> > > > > > Der Nachfolgende Code veranschaulicht das Problem:
> > > > > > Wenn man auf dem Saisir.... drückt wird ein Widget mit einen =
EntryBox
> > > > > > erstellt der eingegeben Text wird durch Valider auf die Konsole
> > > > > > ausgegeben und das widget geschlossen.
> > > > > > Wenn ich nun 2 mal auf Saisir.... klicke dann werden 2 Widgets
> > > > > > erstellt ich kann allerdings nur die zuletzt erstellte Steueren=
.. d.h.
> > > > > > die zuerst erstellte reagiert nicht auf drücken des Buttons.
> > > > > > Hat irgendjemand eine idee wie man das Problem lösen könnte=
?`danke
>
> > > > > Es sieht tatsächlich so aus, als ob verschachtelte
> > > > > waitVariable-Aufrufe nicht funktionieren. Aber brauchst du
> > > > > waitVariable überhaupt? Normalerweise benutzt man waitVariable,=
wenn
> > > > > man die GUI (scheinweise) blockieren möchte. Du möchtest aber
> > > > > anscheinend, dass man weiterhin den Button im Hauptfenster anklic=
ken
> > > > > kann. Könntest du nicht mit einfachen Callbacks arbeiten?
>
> > > > > Gruß,
> > > > > Slaven
>
> > > > > --
> > > > > Slaven Rezic - slaven rezic de
> > > > > babybike - routeplanner for cyclists in Berlin
> > > > > handheld (e.g. Compaq iPAQ with Linux) version of =
bbbike
> > > > > http://bbbike.sourceforge.net
>
> > > > Callbacks sind eine gute Idee. Leider habe ich bisher nur mit wait-
> > > > Variablen erfahrung. Gibt es irgendwo ein Beispiel wie man sowas mit
> > > > Callbacks realisieren kann?
>
> > > Du benutzt in deinem Skript bereits einen Callback, aber dieser setzt
> > > nur die Variable, um waitVariable() aufzuheben. Du müsstest also den
> > > Code, der nach Wait() ausgeführt werden soll, in diesen Callback
> > > ausführen lassen.
>
> > > Gruß,
> > > Slaven
>
> > > --
> > > Slaven Rezic - slaven rezic de
>
> > > tknotes - A knotes clone, written in Perl/Tk.
> > > http://ptktools.sourceforge.net/#tknotes
>
> > Naja das ist schon klar ich könnte ja einfach im Button (-command)
> > alles nach wait ausführen. Es gibt da nur ein kleines Problem:
> > Ich will ja etwas per return an Mainwindow übergeben...in dem
> > vereinfachten Beispiel ist es eine Variable in mein Script ist es ein
> > Hash, das wird dann als return-Wert von show() an Mainwindow
> > übergeben. Da komm ich aber dann nicht mehr hin.....
>
> Du denkst noch immer linear, aber bei GUI-Programmierung musst du
> event-basiert denken.
>
> > Man kann auch in Populate mit ConfigSpecs callbacks erstellen den
> > dann wenn der Button gedrückt wird setzen und dadurch am Mainwindow
> > übergeben. Würde das Funktionieren?
>
> Das hört sich schon viel besser an. Ich störe mich noch am Begriff "am
> Mainwindow übergeben". Das MainWindow ist ein Objekt und keine
> Funktion, der man etwas übergeben könnte.
>
> Gruß,
> Slaven
>
> --
> Slaven Rezic - slaven rezic de
>
> tkruler - Perl/Tk program for measuring screen distances
> http://ptktools.sourceforge.net/#tkruler
Linear denken ist einfacher und nicht so Fehleranfällig. Aber du hast
sicherlich Recht.
Inzwischen habe ich die Idee mit den Callbacks umgesetzt funktioniert
auch einwandfrei,
danke dafür.
gruß
Andrei