Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]5306[/thread]

Tk::Text verliert den Fokus



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
PerlProfi
 2007-04-03 16:01
#46270 #46270
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich habe ein Textwidget in meiner Applikation und möchte bei einem <Control-Tab> Event Daten in das Textfeld schreiben, danach soll der Fokus wieder im Textfeld liegen.
Leider verliert das Textfeld aber bei diesem Event den Fokus und auch ein $text->focus() in der callback-Routine bringt nichts.
Allerdings kann ich den Fokus vorher normal setzen.

Das Textwidget ist Scrolled(), aber es macht anscheinend keinen Unterschied ob ich den Frame oder das Textwidget anspreche.

Beispiel, welches das Problem verdeutlicht:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl
use strict;
use warnings 'all';
use Tk;
use Tk::Text;

my $mw = tkinit;

my $text = $mw->Scrolled('Text' =>
-scrollbars => 'ose',
-background => 'white',
-wrap => 'none')
->pack(-fill => 'both',
-expand => 1);

$text -> focus();
$text -> bind('<Control-Tab>', sub { $text->focus() });

MainLoop;

Das Textfeld sollte den Fokus zu Anfang schon besitzen.
Drückt man jetzt Strg-Tab, so verliert das Textfeld den Fokus, obwohl es eigentlich den Fokus bekommen sollte.

Weiß jemand wie ich es anstellen muss, damit das Textfeld den Fokus behält?

MfG PerlProfi
renee
 2007-04-03 16:06
#46271 #46271
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
probier's mal mit focusForce.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
PerlProfi
 2007-04-03 17:14
#46272 #46272
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Erstmal danke für die schnelle Antwort.

Hab ich vergessen dazu zu schreiben, dass hat auch nichts gebracht.

Ich nehme an, dass die callback-Routine ausgeführt wird, bevor, das Textfeld den Fokus verliert.
Daher habe ich $mw->after(50, sub { $text->focus() }) auch mal mit eingebaut. Es hat funktioniert, aber diese Methode finde ich irgendwie unsauber.

MfG PerlProfi
Ishka
 2007-04-03 17:30
#46273 #46273
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
mir würde nur einfallen bei allen anderen widgets -takefocus=>0 zu setzen, aber die beste Lösung ist das, glaube ich, auch nicht (und probiert habe ich es auch nicht).
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
PerlProfi
 2007-04-03 17:58
#46274 #46274
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Ich hab das gerade mal in das Testskript mit eingebaut, leider ohne Effekt. Der Fokus verschwindet trotzdem.
ptk
 2007-04-04 01:17
#46275 #46275
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Du weißt, dass Control-Tab von Text verwendet wird, um ganz normal zum nächsten Widget zu springen? Tab im Text-Widget selbst wird ja normal eingefügt, deshalb braucht man eine anderes Binding für focusNext.

Wenn du aber tatsächlich Control-Tab überschreiben willst, musst du entweder eine Subklasse erstellen oder mit bindkeys arbeiten.
Sucher
 2007-04-04 02:29
#46276 #46276
User since
2007-03-26
47 Artikel
BenutzerIn
[default_avatar]
[quote=PerlProfi,03.04.2007, 14:01]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl
use strict;
use warnings 'all';
use Tk;
use Tk::Text;

my $mw = tkinit;

my $text = $mw->Scrolled('Text' =>
-scrollbars => 'ose',
-background => 'white',
-wrap => 'none')
->pack(-fill => 'both',
-expand => 1);

$text -> focus();
$text -> bind('<Control-Tab>', sub { $text->focus();
$text->break;
});

MainLoop;
[/quote]
Hallo,
So geht es, glaube ich:
PerlProfi
 2007-04-04 11:17
#46277 #46277
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
[quote=ptk,03.04.2007, 23:17]Wenn du aber tatsächlich Control-Tab überschreiben willst, musst du entweder eine Subklasse erstellen oder mit bindkeys arbeiten.[/quote]
Was genau sind denn bindkeys?
Dazu habe ich bei der Forumssuche und bei google nichts gefunden.

@Sucher, die Lösung hat super funktioniert, ich denke ich werde es so machen und mir ein neues binding für focusNext ausdenken.

MfG PerlProfi
ptk
 2007-04-05 02:43
#46278 #46278
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Sorry, ich meinte bindtags, nicht bindkeys.
PerlProfi
 2007-04-05 12:50
#46279 #46279
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Gibt es denn irgendwelche Nachteile von break() ?
Das scheint mir dann nämlich doch noch der einfachste Weg.
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2007-04-03 16:01.