Thread [Tk::bind] Verbesserungsvorschläge gesucht (4 answers)
Opened by pktm at 2011-03-11 12:56

pktm
 2011-03-11 12:56
#146392 #146392
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Ich habe hier mal eine Funktionalität nachgebaut, die ich auf Webseiten öfter mal vorfinde. Dort gibt es ein Input-Feld, das bereits Text enthält, z.B. "Suchen..." (wäre übrigens oben für die Sucheingabe auch ganz schön :)).

Jedenfalls passiert - soweit ich das richtig beobachtet habe - folgendes:

  • Wenn man in das Feld klickt (FocusIs), wird der Hinweis ausgeblendet.
  • Wenn man das Feld verlässt (FocusOut) und ...
    • ... man nichts eingegeben hat, dann wird der Hinweis wieder angezeigt.
    • ... man etwas eingegeben hat, dann bleibt der Inhalt erhalten.
  • Manchmal, wenn man in das Feld klickt, irgend etwas eingibt und dann Escape drückt, steht da wieder die vorherige Eingabe. Wenn das Feld leer war, wieder der Hinweis.


Wie gesagt, ich habe das mal nachgebaut. Allerdings ist der Code irgendwie unübersichtlich. Das liegt natürlich auch daran, dass sich kein einziger Kommentar darin befindet. Dennoch würde es mich interessieren, ob das nicht besser geht.

Hat schon mal jemand sowas implementiet? Geht das bei anderen Toolkits besser (z.B. Prima / Wx)?

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!perl

use strict;
use warnings;
use Tk;

my $mw = tkinit(-width => 400, -height => 300,);
$mw->packPropagate(0);

my $default_text = 'Default...';
my $previous_input = '';
my $e = $mw->Entry(-text => $default_text)->pack(-fill => 'x', -expand => 0);
my $e2 = $mw->Entry(-text => 'dummy',)->pack(-fill => 'both', -expand => 1);

$e->bind('<FocusIn>' => [sub{
        my $entry               = shift;
        my $default             = shift;
        my $previous    = shift;
        
        if( $entry->get() eq $default_text ) {
                $entry->delete(0, 'end');
                $$previous = '';
        }else{
                $$previous = $entry->get();
        }
        
}, $default_text, \$previous_input]);

$e->bind('<FocusOut>' => [sub{
        my $entry               = shift;
        my $default             = shift;
        my $previous    = shift;
        
        if( $entry->get() eq '' ) {
                $entry->insert(0, $default_text);
                $$previous = '';
        }else{
                $$previous = $entry->get();
        }
        
        print "previous input is now set to [$$previous]\n";
        
}, $default_text, \$previous_input]);

$e->bind('<Escape>' => [sub{
        my $entry               = shift;
        my $mw                  = shift;
        my $previous    = shift;

        if( $$previous ne '' and $entry->get() ne $previous_input ) {
                $entry->delete(0, 'end');
                $entry->insert(0, $$previous);
        }

        $mw->focus();
        
}, $mw, \$previous_input]);

$e->bind('<KeyPress>' => [sub{
        my $entry       = shift;
        my $key         = shift;
        
        return undef if $key eq 'Escape';
        
        print "$key was pressed\n";
        
}, Ev('K')]);

$mw->MainLoop();
exit(0);


Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )

View full thread [Tk::bind] Verbesserungsvorschläge gesucht