Thread [Tk::bind] Verbesserungsvorschläge gesucht
(4 answers)
Opened by pktm at 2011-03-11 12:56
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:
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 :) )
|