Entry scrollen

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