Perl Tk Tab Reihenfolge

Perl Tk Tab Reihenfolge

am 22.05.2007 12:06:41 von Robert Berghaus

Hallo

In Perl Tk wird die Tab Reihenfolge durch die Pack Reihenfolge=20
bestimmt. Kann ich das eine ohne das andere ändern?
Wenn nicht, muß ich Tab im Programm selber verarbeiten. Gibt es da=20
irgendwas zu beachten?

Schönen Gruß aus dem Bergischen Land
Robert

Re: Perl Tk Tab Reihenfolge

am 22.05.2007 21:18:34 von Slaven Rezic

Robert Berghaus writes:

> Hallo
>
> In Perl Tk wird die Tab Reihenfolge durch die Pack Reihenfolge
> bestimmt. Kann ich das eine ohne das andere ändern?

Vielleicht kannst du focusNext und focusPrev überschreiben?

> Wenn nicht, muß ich Tab im Programm selber verarbeiten. Gibt es da
> irgendwas zu beachten?

Unter Umständen musst du mit bindtags arbeiten (siehe Tk::bindtags),
und vielleicht brauchst du auch ein Tk->break.

Gruß,
Slaven

--
Slaven Rezic - slaven rezic de

Dump a Tk canvas as an xfig file:
http://search.cpan.org/search?mode=module&query=Tk::CanvasFi g

Re: Perl Tk Tab Reihenfolge

am 23.05.2007 18:00:35 von Robert Berghaus

Hallo Slaven


Slaven Rezic schrieb:
> Robert Berghaus writes:
>=20
>> Hallo
>>
>> In Perl Tk wird die Tab Reihenfolge durch die Pack Reihenfolge
>> bestimmt. Kann ich das eine ohne das andere ändern?
>=20
> Vielleicht kannst du focusNext und focusPrev überschreiben?
>=20

Muß ich mir erst mal ansehen. Noch versuche ich es ohne.

>> Wenn nicht, muß ich Tab im Programm selber verarbeiten. Gibt es da
>> irgendwas zu beachten?
>=20
> Unter Umständen musst du mit bindtags arbeiten (siehe Tk::bindtags),
> und vielleicht brauchst du auch ein Tk->break.

Bindtags benutze ich schon (zumindest arbeite ich schon mit=20
->bind), Tk->break hatte ich aber bisher noch nicht gesehen. Das=20
brauche ich aber, wenn ich selber verwalten will.
Ich habe jetzt auf einer Notebook Seite 10 Eingabefelder und komme=20
mit Tab und Shift-Tab auf das jeweils richtige Feld. Vom ersten=20
und letzten will ich jeweils auf die Tabs des Notebooks kommen,=20
das funktioniert aber noch nicht (ich habe keine Ahnung, welches=20
Widget das sein soll). Wenn ich jetzt vom Nirwana mit Tab wieder=20
auf meine Eingabefelder kommen will, so wird das erste laut der=20
pack Ordnung angewählt und die Eingabe wird automatisch=20
selektiert. Vielleicht muß ich doch noch focusNext und focusPrev=20
überschreiben (sind das Methoden vom MainWindows?).
Eine Schwierigkeit besteht auch darin, Shift-Tab zu erkennen. Bind=20
liefert mir einmal Shift und einmal Tab, aber kein Shift-Tab. Wo=20
speichert Tk den Status dieser Tasten (Shift, Control, Alt)?


Vielen Dank und schönen Gruß aus dem Bergischen Land
Robert

Re: Perl Tk Tab Reihenfolge

am 23.05.2007 19:34:42 von KWittrock

"Robert Berghaus" schrieb im Newsbeitrag
news:c1.2bm.35Lv3k$LSR@TPA31p-os2.robe-edv.lokal...
> Hallo
>
> In Perl Tk wird die Tab Reihenfolge durch die Pack Reihenfolge bestimmt.
> Kann ich das eine ohne das andere ändern?

Entweder benutzt du die Methoden $widget->raise oder $widget->lower, um die
Tab-Reihenfolge zu ändern. Optionales Argument ist dabei jeweils ein
Referenz-Widget, das zum Tab-Nachbar werden soll.

Oder du schreibst deine packs in der gewünschten Tab-Reihenfolge und benutzt
dabei die Optionen -before oder -after, um die Position des Widgets im
Container zu beeinflussen.

Gruß

Klaus

Re: Perl Tk Tab Reihenfolge

am 23.05.2007 23:54:44 von Slaven Rezic

Robert Berghaus writes:

[...]
> Eine Schwierigkeit besteht auch darin, Shift-Tab zu erkennen. Bind
> liefert mir einmal Shift und einmal Tab, aber kein Shift-Tab. Wo
> speichert Tk den Status dieser Tasten (Shift, Control, Alt)?

Versuch mal:

...
my $e = $w->XEvent;
warn $e->s;

--
Slaven Rezic - slaven rezic de

Visualize Makefiles with GraphViz:
http://user.cs.tu-berlin.de/~eserte/src/perl/GraphViz-Makefi le/

Re: Perl Tk Tab Reihenfolge

am 24.05.2007 19:58:32 von Robert Berghaus

Slaven Rezic schrieb:
> Robert Berghaus writes:
>=20
> [...]
>> Eine Schwierigkeit besteht auch darin, Shift-Tab zu erkennen. Bind
>> liefert mir einmal Shift und einmal Tab, aber kein Shift-Tab. Wo
>> speichert Tk den Status dieser Tasten (Shift, Control, Alt)?
>=20
> Versuch mal:
>=20
> ...
> my $e =3D $w->XEvent;
> warn $e->s;
>=20

Ich benutze statt dessen Tk::event und bisher noch nichts=20
negatives festgestellt. Wenn ich dann noch bind mit MainWindow=20
nutze, so bekomme ich jeden Tastenanschlag mit.
Mich würde trotzdem interessieren, wo Tk das speichert, denn Tab=20
und Shift-Tab funktioniert ja immer.

--=20
Schönen Gruß aus dem Bergischen Land
Robert

Re: Perl Tk Tab Reihenfolge

am 24.05.2007 20:07:38 von Robert Berghaus

Hallo Klaus

K. Wittrock schrieb:
>=20
> "Robert Berghaus" schrieb im Newsbeitrag=20
> news:c1.2bm.35Lv3k$LSR@TPA31p-os2.robe-edv.lokal...
>> Hallo
>>
>> In Perl Tk wird die Tab Reihenfolge durch die Pack Reihenfolge=20
>> bestimmt. Kann ich das eine ohne das andere ändern?
>=20
> Entweder benutzt du die Methoden $widget->raise oder $widget->lower, um=
=20
> die Tab-Reihenfolge zu ändern. Optionales Argument ist dabei jeweils =
ein=20
> Referenz-Widget, das zum Tab-Nachbar werden soll.
>=20

raise und lower funktioniert nicht für Tabs. Wenn ich die Doku=20
richtig verstehe, so wird hiermit festgelegt, wie die Widgets in=20
der 3. Dimension angelegt werden. Das funktioniert aber auch nicht=20
Frame übergreifend.

> Oder du schreibst deine packs in der gewünschten Tab-Reihenfolge und =

> benutzt dabei die Optionen -before oder -after, um die Position des=20
> Widgets im Container zu beeinflussen.

Auch das geht (zumindest noch) nicht. Ich benutze für jede Spalte=20
einen Frame und will vom 1. Widget aus Frame 1 zum 1. Widget aus=20
Frame 2 usw. Vielleicht werde ich das aber auch noch ändern.

Wenn der Tastaturfocus auf einem Tab vom Notebook ist und ich mit=20
focusCurrent das aktuelle Widget ausgeben lasse, so kommt immer=20
das Notebook. Wenn ich das jetzt in meiner Liste eintrage, so sagt=20
mir Perl, das noch focus und name fehlen. Das werde ich mir noch=20
genauer ansehen.

--=20
Schönen Gruß aus dem Bergischen Land
Robert

Re: Perl Tk Tab Reihenfolge

am 25.05.2007 15:40:57 von KWittrock

"Robert Berghaus" schrieb im Newsbeitrag
news:c1.2bm.35NKdk$LSj@TPA31p-os2.robe-edv.lokal...
> Hallo Klaus
>
> K. Wittrock schrieb:
>>
>> "Robert Berghaus" schrieb im Newsbeitrag
>> news:c1.2bm.35Lv3k$LSR@TPA31p-os2.robe-edv.lokal...
>>> Hallo
>>>
>>> In Perl Tk wird die Tab Reihenfolge durch die Pack Reihenfolge bestimmt.
>>> Kann ich das eine ohne das andere ändern?
>>
>> Entweder benutzt du die Methoden $widget->raise oder $widget->lower, um
>> die Tab-Reihenfolge zu ändern. Optionales Argument ist dabei jeweils ein
>> Referenz-Widget, das zum Tab-Nachbar werden soll.
>>
>
> raise und lower funktioniert nicht für Tabs.

Doch.

> Wenn ich die Doku richtig verstehe, so wird hiermit festgelegt, wie die
> Widgets in der 3. Dimension angelegt werden.

Auch.

> Das funktioniert aber auch nicht Frame übergreifend.
>
>> Oder du schreibst deine packs in der gewünschten Tab-Reihenfolge und
>> benutzt dabei die Optionen -before oder -after, um die Position des
>> Widgets im Container zu beeinflussen.
>
> Auch das geht (zumindest noch) nicht. Ich benutze für jede Spalte einen
> Frame und will vom 1. Widget aus Frame 1 zum 1. Widget aus Frame 2 usw.
> Vielleicht werde ich das aber auch noch ändern.

Meine beiden Rezepte funktionieren leider nur im selben Frame. Aber so
geht's:

my @fr;
$fr[$_] = $mw->Frame->pack(-side => 'left') foreach (0 .. 1);
foreach my $line (0 .. 2) {
$mw->Button(-text => $line)->pack(-in => $fr[0]);
$mw->Button(-text => $line)->pack(-in => $fr[1]);
}

Überlege mal, ob für deinen Zweck der Gridmanager geeigneter ist.

Gruß

Klaus

Re: Perl Tk Tab Reihenfolge

am 25.05.2007 18:23:11 von Robert Berghaus

Robert Berghaus schrieb:
> Slaven Rezic schrieb:
>> Robert Berghaus writes:
>>
>> [...]
>>> Eine Schwierigkeit besteht auch darin, Shift-Tab zu erkennen. Bind
>>> liefert mir einmal Shift und einmal Tab, aber kein Shift-Tab. Wo
>>> speichert Tk den Status dieser Tasten (Shift, Control, Alt)?
>>
>> Versuch mal:
>>
>> ...
>> my $e =3D $w->XEvent;
>> warn $e->s;
>>
>=20
> Ich benutze statt dessen Tk::event und bisher noch nichts negatives=20
> festgestellt. Wenn ich dann noch bind mit MainWindow nutze, so bekomme =

> ich jeden Tastenanschlag mit.
> Mich würde trotzdem interessieren, wo Tk das speichert, denn Tab und =

> Shift-Tab funktioniert ja immer.
>=20

Shift-Tab brauche ich gar nicht zu erkennen, das macht Tk schon=20
für mich (->bind(<> ...)). Das jetzt mit einer Funktion=20
verbunden und ein eigenes Feld mit Tab-Widgets und es=20
funktioniert. Das Notebook Tab lasse ich außen vor, dafür habe ich=20
Acceleratoren definiert. Jetzt muß ich mir nur noch merken,=20
welches Widget beim Umschalten aktiv ist und die Seite hat beim=20
Zurückschalten wieder denselben Stand. Mit der Tastatur geht es=20
schon, beim Umschalten mit der Maus fehlt mir noch der=20
Umschaltvorgang. Da werde ich aber auch noch eine Lösung finden.

--=20
Schönen Gruß aus dem Bergischen Land
Robert

Re: Perl Tk Tab Reihenfolge

am 26.05.2007 14:17:17 von Robert Berghaus

K. Wittrock schrieb:
>=20
> "Robert Berghaus" schrieb im Newsbeitrag
> news:c1.2bm.35NKdk$LSj@TPA31p-os2.robe-edv.lokal...
>> Hallo Klaus
>>
>> K. Wittrock schrieb:
>>>
>>> "Robert Berghaus" schrieb im Newsbeitrag
>>> news:c1.2bm.35Lv3k$LSR@TPA31p-os2.robe-edv.lokal...
>>>> Hallo
>>>>
>>>> In Perl Tk wird die Tab Reihenfolge durch die Pack Reihenfolge=20
>>>> bestimmt.
>>>> Kann ich das eine ohne das andere ändern?
>>>
>>> Entweder benutzt du die Methoden $widget->raise oder $widget->lower, =
um
>>> die Tab-Reihenfolge zu ändern. Optionales Argument ist dabei jeweil=
s ein
>>> Referenz-Widget, das zum Tab-Nachbar werden soll.
>>>
>>
>> raise und lower funktioniert nicht für Tabs.
>=20
> Doch.
>=20

Bei mir funktioniert es nicht (oder ich mache es falsch). Mein=20
Testscript:
#!/usr/bin/perl -w

use strict;
use warnings;
use Tk;

my $mw =3D tkinit;


my $Button1 =3D $mw->Button(-text =3D> "Button1")->pack(-pady =3D> 2);
my $Button2 =3D $mw->Button(-text =3D> "Button2")->pack(-pady =3D> 2);
my $Button3 =3D $mw->Button(-text =3D> "Button3")->pack(-pady =3D> 2);
my $Button4 =3D $mw->Button(-text =3D> "Button4")->pack(-pady =3D> 2);

$Button3->raise($Button2);

MainLoop;

Wenn ich hier mit Tab durchgehe, so kommt 1, 2, 3, 4, ich erwarte=20
aber 1, 3, 2, 4.

>> Wenn ich die Doku richtig verstehe, so wird hiermit festgelegt, wie di=
e
>> Widgets in der 3. Dimension angelegt werden.
>=20
> Auch.
>=20
>> Das funktioniert aber auch nicht Frame übergreifend.
>>
>>> Oder du schreibst deine packs in der gewünschten Tab-Reihenfolge un=
d
>>> benutzt dabei die Optionen -before oder -after, um die Position des
>>> Widgets im Container zu beeinflussen.
>>
>> Auch das geht (zumindest noch) nicht. Ich benutze für jede Spalte ei=
nen
>> Frame und will vom 1. Widget aus Frame 1 zum 1. Widget aus Frame 2 usw=

>> Vielleicht werde ich das aber auch noch ändern.
>=20
> Meine beiden Rezepte funktionieren leider nur im selben Frame. Aber so
> geht's:
>=20
> my @fr;
> $fr[$_] =3D $mw->Frame->pack(-side =3D> 'left') foreach (0 .. 1);
> foreach my $line (0 .. 2) {
> $mw->Button(-text =3D> $line)->pack(-in =3D> $fr[0]);
> $mw->Button(-text =3D> $line)->pack(-in =3D> $fr[1]);
> }
>=20

Dafür wird als "-in" gebraucht. Funktioniert einwandfrei. Beim=20
Durchlesen hatte ich mir nur gedacht 'das brauchst du nie' und es=20
dann natürlich auch prompt vergessen. :-)

> Überlege mal, ob für deinen Zweck der Gridmanager geeigneter ist.
>=20

Im Buch "Mastering Perl/Tk" wird davor gewarnt, die Manager zu=20
mischen, deswegen hatte ich das gar nicht in Erwägung gezogen.=20
Wenn ich in einem Frame einen anderen Manager nehme, klappt es=20
einwandfrei.
Der Gridmanager ist für meinen Zweck auch geeigneter (es ist=20
schließlich eine Tabelle).


--=20
Vielen Dank und schönen Gruß aus dem Bergischen Land
Robert

Re: Perl Tk Tab Reihenfolge

am 26.05.2007 15:13:00 von Ch Lamprecht

Robert Berghaus schrieb:
> K. Wittrock schrieb:
>
>>
>> "Robert Berghaus" schrieb im Newsbeitrag
>> news:c1.2bm.35NKdk$LSj@TPA31p-os2.robe-edv.lokal...
>>
>>> Hallo Klaus
>>>
>>> K. Wittrock schrieb:
>>>
>>>>
>>>> "Robert Berghaus" schrieb im Newsbeitrag
>>>> news:c1.2bm.35Lv3k$LSR@TPA31p-os2.robe-edv.lokal...
>>>>
>>>>> Hallo
>>>>>
>>>>> In Perl Tk wird die Tab Reihenfolge durch die Pack Reihenfolge
>>>>> bestimmt.
>>>>> Kann ich das eine ohne das andere ändern?
>>>>
>>>>
>>>> Entweder benutzt du die Methoden $widget->raise oder $widget->lower, um
>>>> die Tab-Reihenfolge zu ändern. Optionales Argument ist dabei jeweils
>>>> ein
>>>> Referenz-Widget, das zum Tab-Nachbar werden soll.
>>>>
>>>
>>> raise und lower funktioniert nicht für Tabs.
>>
>>
>> Doch.
>>
>
> Bei mir funktioniert es nicht (oder ich mache es falsch). Mein Testscript:
> #!/usr/bin/perl -w
>
> use strict;
> use warnings;
> use Tk;
>
> my $mw = tkinit;
>
>
> my $Button1 = $mw->Button(-text => "Button1")->pack(-pady => 2);
> my $Button2 = $mw->Button(-text => "Button2")->pack(-pady => 2);
> my $Button3 = $mw->Button(-text => "Button3")->pack(-pady => 2);
> my $Button4 = $mw->Button(-text => "Button4")->pack(-pady => 2);
>
> $Button3->raise($Button2);
>
> MainLoop;
>
> Wenn ich hier mit Tab durchgehe, so kommt 1, 2, 3, 4, ich erwarte aber
> 1, 3, 2, 4.


Hallo,

hast du es einmal mit 'lower' probiert? $Button3 ist ja erst nach $Button2
gepackt woeden, liegt also schon 'über' diesem.

Christoph


--
use Tk;use Tk::GraphItems;$c=tkinit->Canvas->pack;push@i,Tk::GraphItems ->
TextBox(text=>$_,canvas=>$c,x=>$x+=70,y=>100)for(Just=>anoth er=>Perl=>Hacker);
Tk::GraphItems->Connector(source=>$i[$_],target=>$i[$_+1])fo r(0..2);
$c->repeat(30,sub{$_->move(0,4*cos($d+=3.16))for(@i)});MainL oop

Re: Perl Tk Tab Reihenfolge

am 27.05.2007 11:18:03 von KWittrock

"Robert Berghaus" schrieb im Newsbeitrag
news:c1.2bm.35PPmZ$LSp@TPA31p-os2.robe-edv.lokal...
> K. Wittrock schrieb:
>>
>> "Robert Berghaus" schrieb im Newsbeitrag
>> news:c1.2bm.35NKdk$LSj@TPA31p-os2.robe-edv.lokal...

>> ........ Aber so
>> geht's:
>>
>> my @fr;
>> $fr[$_] = $mw->Frame->pack(-side => 'left') foreach (0 .. 1);
>> foreach my $line (0 .. 2) {
>> $mw->Button(-text => $line)->pack(-in => $fr[0]);
>> $mw->Button(-text => $line)->pack(-in => $fr[1]);
>> }
>>
>
> Dafür wird als "-in" gebraucht. Funktioniert einwandfrei. Beim Durchlesen
> hatte ich mir nur gedacht 'das brauchst du nie' und es dann natürlich auch
> prompt vergessen. :-)

Ging mir genauso. Als mein Beispiel lief, dachte ich "jetzt weiß ich
endlich, wozu -in gut ist".

>
>> Überlege mal, ob für deinen Zweck der Gridmanager geeigneter ist.
>>
>
> Im Buch "Mastering Perl/Tk" wird davor gewarnt, die Manager zu mischen,
> deswegen hatte ich das gar nicht in Erwägung gezogen. Wenn ich in einem
> Frame einen anderen Manager nehme, klappt es einwandfrei.
> Der Gridmanager ist für meinen Zweck auch geeigneter (es ist schließlich
> eine Tabelle).

Mein "Mastering Perl/Tk" ist inzwischen voller Notizen. Weiß jemand eine
gute Alternative?

Gruß

Klaus

Re: Perl Tk Tab Reihenfolge

am 28.05.2007 16:23:42 von Robert Berghaus

Ch Lamprecht schrieb:
> Robert Berghaus schrieb:
>> K. Wittrock schrieb:
>>
[...]
>>
>> Bei mir funktioniert es nicht (oder ich mache es falsch). Mein=20
>> Testscript:
>> #!/usr/bin/perl -w
>>
>> use strict;
>> use warnings;
>> use Tk;
>>
>> my $mw =3D tkinit;
>>
>>
>> my $Button1 =3D $mw->Button(-text =3D> "Button1")->pack(-pady =3D> 2);=

>> my $Button2 =3D $mw->Button(-text =3D> "Button2")->pack(-pady =3D> 2);=

>> my $Button3 =3D $mw->Button(-text =3D> "Button3")->pack(-pady =3D> 2);=

>> my $Button4 =3D $mw->Button(-text =3D> "Button4")->pack(-pady =3D> 2);=

>>
>> $Button3->raise($Button2);
>>
>> MainLoop;
>>
>> Wenn ich hier mit Tab durchgehe, so kommt 1, 2, 3, 4, ich erwarte aber=
=20
>> 1, 3, 2, 4.
>=20
>=20
> Hallo,
>=20
> hast du es einmal mit 'lower' probiert? $Button3 ist ja erst nach=20
> $Button2 gepackt woeden, liegt also schon 'über' diesem.
>=20

Mit lower gehts. Ich bin von der Tabulatorreihenfolge ausgegangen=20
und hier bekommt ja das erste gepackte Widget auch als erstes den=20
Fokus (bei Tab). Das werde ich mir jetzt mal ins Buch eintragen.

--
Schönen Gruß aus dem Bergischen Land
Robert