Entry scrollen
am 26.11.2006 15:16:03 von Mike Wesling
Hallo,
ich habe zum Scrollen eines Entry-Widgets folgenden Code gefunden,
verstehe ihn aber im Detail nicht bzw. weiss nicht genau, was dabei
abläuft. Leider weiss ich auch nicht genau, wo ich in den Manpages was
dazu finde, daher hoffe ich bei Euch das nötige Wissen zu bekommen.
Also, was läuft hier im Detail ab:
my $scrollbar = $main->Scrollbar(-orient => "horizontal");
my $entry = $main->Entry(..., -xscrollcommand=>[ 'set' => $scrollbar ])
$scrollbar->configure(-command => [ $entry => 'xview' ])
Ich sehe hier zwar, dass ich bei 'set' einen Verweis auf meine Scrollbar
mache und wohl auch bei der Scrollbar einen Verweis auf mein Entry
anbringe, aber
a) weshalb ist das in [ ... ] untergebracht und
b) was passiert hier bei 'xview' und 'set', vor allem auch im
Zusammenhabn mit '=>'
Bisher ist mir eigentlich nur der Weg bekannt, dass ich über '=>' bei
einer Option die entsprechenden Einstellungen treffen kann also
beispielsweise in Form von '...->Button(-text => 'OK', ...)'.
Ein Konstrukt wie oben ist mir unbekannt.
Re: Entry scrollen
am 26.11.2006 16:35:35 von hjp-usenet2
On 2006-11-26 14:16, Mike Wesling wrote:
> ich habe zum Scrollen eines Entry-Widgets folgenden Code gefunden,
> verstehe ihn aber im Detail nicht bzw. weiss nicht genau, was dabei
> abläuft. Leider weiss ich auch nicht genau, wo ich in den Manpages was
> dazu finde, daher hoffe ich bei Euch das nötige Wissen zu bekommen.
>
> Also, was läuft hier im Detail ab:
>
> my $scrollbar = $main->Scrollbar(-orient => "horizontal");
> my $entry = $main->Entry(..., -xscrollcommand=>[ 'set' => $scrollbar ])
> $scrollbar->configure(-command => [ $entry => 'xview' ])
>
>
> Ich sehe hier zwar, dass ich bei 'set' einen Verweis auf meine Scrollbar
> mache und wohl auch bei der Scrollbar einen Verweis auf mein Entry
> anbringe, aber
>
> a) weshalb ist das in [ ... ] untergebracht und
Um eine Liste mehrerer Werte als ein Argument übergeben zu können. []
konstruiert einen Verweis auf ein anonymes Array.
> b) was passiert hier bei 'xview' und 'set', vor allem auch im
> Zusammenhabn mit '=>'
>
> Bisher ist mir eigentlich nur der Weg bekannt, dass ich über '=>' bei
> einer Option die entsprechenden Einstellungen treffen kann also
> beispielsweise in Form von '...->Button(-text => 'OK', ...)'.
Das ist ein Irrtum. Du kannst über '=>' keine "Einstellungen treffen".
'=>' ist nichts anderes als ein etwas seltsam geschriebenes Komma.
Ãberall, wo Du ',' schreiben kannst, kannst Du auch '=>' schreiben und
umgekehrt. Stilistisch verwendet man '=>' dort, wo man Paare
zusammengehörender Werte kennzeichnen will. Statt
(a, b, c, d, e, f, g, h)
schreibt man, wenn das tatsächlich vier Paare und nicht acht Einzelwerte
sein sollen, besser
(a => b, c => d, e => f, g => h)
Damit ist klar, dass e und f zusammengehören, ohne dass man nachzählen
muss. '=>' hat auÃerdem den Vorteil, dass man sich im linken Teil häufig
die Anführungszeichen sparen kann. Man kann also
(-orient => "horizontal")
schreiben statt
('-orient' => "horizontal")
was etwas Tipparbeit erspart und hübscher aussieht.
> Ein Konstrukt wie oben ist mir unbekannt.
perldoc perlop.
perldoc perldata.
--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd
Re: Entry scrollen
am 26.11.2006 17:32:17 von Slaven Rezic
"Peter J. Holzer" writes:
> On 2006-11-26 14:16, Mike Wesling wrote:
> > ich habe zum Scrollen eines Entry-Widgets folgenden Code gefunden,
> > verstehe ihn aber im Detail nicht bzw. weiss nicht genau, was dabei
> > abläuft. Leider weiss ich auch nicht genau, wo ich in den Manpages was
> > dazu finde, daher hoffe ich bei Euch das nötige Wissen zu bekommen.
> >
> > Also, was läuft hier im Detail ab:
> >
> > my $scrollbar = $main->Scrollbar(-orient => "horizontal");
> > my $entry = $main->Entry(..., -xscrollcommand=>[ 'set' => $scrollbar ])
> > $scrollbar->configure(-command => [ $entry => 'xview' ])
> >
> >
> > Ich sehe hier zwar, dass ich bei 'set' einen Verweis auf meine Scrollbar
> > mache und wohl auch bei der Scrollbar einen Verweis auf mein Entry
> > anbringe, aber
> >
> > a) weshalb ist das in [ ... ] untergebracht und
>
> Um eine Liste mehrerer Werte als ein Argument übergeben zu können. []
> konstruiert einen Verweis auf ein anonymes Array.
Hier sollte noch darauf hingewiesen werden, dass diese Schreibweise
eine Perl/Tk-spezifische Variante ist, einen Methodenaufruf zu
tätigen. Mehr Informationen verrät die Pod-Seite Tk::callbacks.
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: Entry scrollen
am 26.11.2006 19:48:44 von Mike Wesling
Peter J. Holzer schrieb:
>> my $scrollbar = $main->Scrollbar(-orient => "horizontal");
>> my $entry = $main->Entry(..., -xscrollcommand=>[ 'set' => $scrollbar ])
>> $scrollbar->configure(-command => [ $entry => 'xview' ])
>>
>> [...]
>> b) was passiert hier bei 'xview' und 'set', vor allem auch im
>> Zusammenhabn mit '=>'
Bei 'set' sieht das dann noch einigermaÃen logisch aus, da ich z.B.
einer set-Variablen eine Scrollbar übergeben kann, aber $entry=>'xview'
sieht irgendwie seltsam aus. Theoretisch müsste doch auch irgendwo
übermittelt werden, wie der Zustand der Scrollbar gerade ist und dieser
muss "irgendwie" auch auf das Entry übertragen werden, damit die beide
sich auch im Einklang bewegen
Re: Entry scrollen
am 26.11.2006 21:00:02 von hjp-usenet2
On 2006-11-26 18:48, Mike Wesling wrote:
> Peter J. Holzer schrieb:
>
>>> my $scrollbar = $main->Scrollbar(-orient => "horizontal");
>>> my $entry = $main->Entry(..., -xscrollcommand=>[ 'set' => $scrollbar ])
>>> $scrollbar->configure(-command => [ $entry => 'xview' ])
>>>
>>> [...]
>
>>> b) was passiert hier bei 'xview' und 'set', vor allem auch im
>>> Zusammenhabn mit '=>'
>
> Bei 'set' sieht das dann noch einigermaÃen logisch aus, da ich z.B.
> einer set-Variablen eine Scrollbar übergeben kann,
Ich weià nicht, was eine "set-Variable" ist, aber man kann einer
Variablen ganz sicher in Perl nichts übergeben. Was hier passiert, ist
dass für $entry festgelegt wird, dass es
$scrollbar->set($x0, $x1)
aufrufen soll, wenn sich irgendwas ändert, was die Anzeige eines
horizontalen Scrollbars ändern könnte (GröÃe des Widgets, GröÃe des
Inhalts, Viewport, ...).
($x1 und $x2 sind dabei Anfang und Ende des horizontalen Viewports)
> aber $entry=>'xview'
> sieht irgendwie seltsam aus. Theoretisch müsste doch auch irgendwo
> übermittelt werden, wie der Zustand der Scrollbar gerade ist und dieser
> muss "irgendwie" auch auf das Entry übertragen werden, damit die beide
> sich auch im Einklang bewegen
Genau das passiert ja auch: Dem Scrollbar wird gesagt: Wenn sich
irgendwas ändert, dass rufe
$entry->xview($x0, $x1)
auf.
(Dass der Autor innerhalb weniger Zeilen einmal [methode, widget] und
einmal [widget, methode] geschrieben hat, zeugt nicht gerade von
Konsistenz. Auch wenn beides geht, sollte man sich im Interesse der
Lesbarkeit entscheiden. Entweder der Autor hatte sich noch nicht
entschieden, was ihm besser gefällt, oder er hat den Code aus
verschiedenen Quellen zusammenkopiert)
--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd
Re: Entry scrollen
am 26.11.2006 21:03:07 von hjp-usenet2
On 2006-11-26 16:32, Slaven Rezic wrote:
> "Peter J. Holzer" writes:
>> On 2006-11-26 14:16, Mike Wesling wrote:
>> > Also, was läuft hier im Detail ab:
>> >
>> > my $scrollbar = $main->Scrollbar(-orient => "horizontal");
>> > my $entry = $main->Entry(..., -xscrollcommand=>[ 'set' => $scrollbar ])
>> > $scrollbar->configure(-command => [ $entry => 'xview' ])
>> >
>> >
>> > Ich sehe hier zwar, dass ich bei 'set' einen Verweis auf meine Scrollbar
>> > mache und wohl auch bei der Scrollbar einen Verweis auf mein Entry
>> > anbringe, aber
>> >
>> > a) weshalb ist das in [ ... ] untergebracht und
>>
>> Um eine Liste mehrerer Werte als ein Argument übergeben zu können. []
>> konstruiert einen Verweis auf ein anonymes Array.
>
> Hier sollte noch darauf hingewiesen werden, dass diese Schreibweise
> eine Perl/Tk-spezifische Variante ist, einen Methodenaufruf zu
> tätigen.
Nicht zu tätigen, sondern nur anzugeben, Getätigt wird der
Methodenaufruf erst später (von $entry bzw. $scrollbar).
hp
--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd
Re: Entry scrollen
am 26.11.2006 22:52:44 von Ch Lamprecht
Peter J. Holzer schrieb:
> On 2006-11-26 18:48, Mike Wesling wrote:
>
>>Peter J. Holzer schrieb:
>>
>>
>>>>my $scrollbar = $main->Scrollbar(-orient => "horizontal");
>>>>my $entry = $main->Entry(..., -xscrollcommand=>[ 'set' => $scrollbar ])
>>>>$scrollbar->configure(-command => [ $entry => 'xview' ])
> Was hier passiert, ist
> dass für $entry festgelegt wird, dass es
> $scrollbar->set($x0, $x1)
> aufrufen soll, wenn sich irgendwas ändert, was die Anzeige eines
> horizontalen Scrollbars ändern könnte (GröÃe des Widgets, GröÃe des
> Inhalts, Viewport, ...).
> ($x1 und $x2 sind dabei Anfang und Ende des horizontalen Viewports)
>
>
>>aber $entry=>'xview'
>>sieht irgendwie seltsam aus. Theoretisch müsste doch auch irgendwo
>>übermittelt werden, wie der Zustand der Scrollbar gerade ist und dieser
>>muss "irgendwie" auch auf das Entry übertragen werden, damit die beide
>>sich auch im Einklang bewegen
>
>
> Genau das passiert ja auch: Dem Scrollbar wird gesagt: Wenn sich
> irgendwas ändert, dass rufe
> $entry->xview($x0, $x1)
> auf.
>
> (Dass der Autor innerhalb weniger Zeilen einmal [methode, widget] und
> einmal [widget, methode] geschrieben hat, zeugt nicht gerade von
> Konsistenz. Auch wenn beides geht, sollte man sich im Interesse der
> Lesbarkeit entscheiden. Entweder der Autor hatte sich noch nicht
> entschieden, was ihm besser gefällt, oder er hat den Code aus
> verschiedenen Quellen zusammenkopiert)
Tk hätte es ihm gerne einfacher gemacht:
use Tk;
my $mw = tkinit();
$mw->Scrolled('Entry',
)->pack();
MainLoop;
Christoph