3 Einträge, 1 Seite |
QuoteMath55 (08 Aug, 2003 16:03):
alles klar. ich möchte praktisch eine autocompletion in einem entry widget machen. so wie bei del unix konsole. ich geben ein:
/v
und er macht mir draus:
/var oder so ähnlich.
ich wollte es nun so machen:
Code: (dl )$input=$eingabefeld->get;
in input steht dann sowas wie /v. nun möchte ich der konsole eben dieses /v übergeben und dann einen tab hinterherschicken. so wie als würde ich /v + tab in der konsole eingeben.
wie geht das?
DANKE:-)
Quote\n\nCrian (08 Aug, 2003 23:37):
So, ich hab mal ein entsprechendes Programm geschrieben:
Code: (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#!/usr/bin/perl
use diagnostics;
use strict;
use warnings;
use Tk;
my $mw = new MainWindow;
$mw->title('Button mit geteiltem Text?');
my $e = $mw->Entry(-text => '',
-width => 80,
)
->pack(
-expand => 1,
-fill => 'x',
);
$mw->bind ('<Tab>', \&vervollstaendige );
$e->focus();
MainLoop();
sub vervollstaendige {
my $text = $e->get();
print $text, "\n";
my @treffer;
my ($pfad, $trenner, $anf) = $text =~ m~^(.*)([/\\])([^/\\]*)$~;
print "pfad='$pfad', Anfang='$anf'\n";
if (! -d $pfad) {
print "'$pfad' ist kein Verzeichnis, Abbruch\n";
}
else {
opendir PFAD, "$pfad/" or die "Kann Verzeichnis '$pfad' nicht öffnen: $!";
my @verzeichnisse = grep -d "$pfad/$_", readdir PFAD;
closedir PFAD;
for my $v (@verzeichnisse) {
print "Verzeichnis '$v'\n";
if ($v =~ /^\Q$anf/i) { # bei Linux/Unix das i entfernen!
print "Anfang '$anf' passt auf '$v'\n";
push @treffer, $v;
}
}
}
if (scalar(@treffer) == 1) {
$e->delete(0, 'end');
$e->insert('end', "$pfad$trenner$treffer[0]");
$e->selectionClear();
$e->icursor('end');
}
else {
$e->delete(0, 'end');
$e->insert('end', "$pfad$trenner$anf");
$e->selectionClear();
$e->icursor('end');
}
} # sub vervollstaendige
Das einzige Problem ist, dass beim Tab-drücken alles selektiert wird, und ich das auch nicht wegbekomme durch Selektion löschen, ganzen Text löschen, neuen Text einfügen... sieht jemand einen Fehler dabei oder weiß einen anderen Rat?
Ansonsten tuts das aber schon, mann muss halt immer tab und dann end drücken, um die Selektion los zu werden.
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
#!/usr/bin/perl
use diagnostics;
use strict;
use warnings;
use Tk;
my $mw = new MainWindow;
$mw->title('Button mit geteiltem Text?');
my $e = $mw->Entry(-text => '',
-width => 80,
)
->pack(
-expand => 1,
-fill => 'x',
);
$mw->bind ('<Tab>', \&vervollstaendige );
$e->focus();
MainLoop();
sub vervollstaendige {
my $text = $e->get();
print $text, "\n";
my @treffer;
my ($pfad, $trenner, $anf) = $text =~ m~^(.*)([/\\])([^/\\]*)$~;
print "pfad='$pfad', Anfang='$anf'\n";
if (! -d $pfad) {
print "'$pfad' ist kein Verzeichnis, Abbruch\n";
}
else {
opendir PFAD, "$pfad/"
or die "Kann Verzeichnis '$pfad' nicht öffnen: $!";
my @verzeichnisse = grep -d "$pfad/$_", readdir PFAD;
closedir PFAD;
for my $v (@verzeichnisse) {
print "Verzeichnis '$v'\n";
if ($v =~ /^\Q$anf/i) { # bei Linux/Unix das i entfernen!
print "Anfang '$anf' passt auf '$v'\n";
push @treffer, $v;
}
}
}
$e->delete(0, 'end');
if (scalar(@treffer) == 1) {
$e->insert('end', "$pfad$trenner$treffer[0]");
}
else {
$e->insert('end', "$pfad$trenner$anf");
}
$e->selectionClear();
$e->icursor('end');
$e->configure(state => 'disable');
$e->configure(state => 'enable');
$e->focus();
} # sub vervollstaendige
3 Einträge, 1 Seite |