Tk: Setze Fenster in den Vordergrund und auf aktiv

11/08/2009 - 15:28 von gg | Report spam
Hallo,

Ich habe habe folgendes Problem. Und zwar möchte ich über einen
Button zwischen zwei Fenstern hin und her springen können.

Der Button vom Fenster soll immer das andere Fenster in den
Vordergrund holen und auf aktiv setzen.

Auf meiner Recherche bin ich immer wieder
auf deiconify(), raise() und grab() gestossen,
diese funktionieren aber nicht, so wie ich es mir vorstelle.
Woran liegt das? Liegt das vielleicht am KDE?

Gibt es keine Lösung bei der man ein Fenster in Vorgrund holen kann,
ohne das man dafür die anderen Windows minimieren muss?

Wer hat eine Lösung für mein Problem.

Mein Versuch:


#!/usr/bin/perl

use strict;
use Tk;


my ($mw,$kw);


$mw = MainWindow->new();
$mw->title("Mainwindow");
$mw->geometry('+5+5');

$mw->Button(-text => " Setze Window 2 in den Vordergrund und
aktiv ", -command => \&show_window)->pack();

MainLoop;



sub show_window
{
eval
{
$kw->deiconify();
$kw->raise();

# $kw->grab();
# $kw->focus();
# $kw->after();

};

if($@) { print "$@ window 2 existiert nicht -> erzeuge es";
undef $@; new_window(); }
else { print "window2 existiert"; }
}

sub new_window
{
if(Exists($kw)) { return; }

$kw = $mw->Toplevel();
$kw->title("Window 2");
$kw->geometry('+0+0');


$kw->Button(-text => "Wenn man auf den Button klickt soll das
Mainwindow in den Vordergrund und aktiv sein",
-font => 'arial 20 bold',
-borderwidth => '1m',
-command =>
sub {
$mw->iconify();
$mw->deiconify();
$mw->raise();
$mw->focus();
})->pack();

}



mir
 

Lesen sie die antworten

#1 K. Wittrock
11/08/2009 - 20:10 | Warnen spam
schrieb im Newsbeitrag
news:
Hallo,

Ich habe habe folgendes Problem. Und zwar möchte ich über einen
Button zwischen zwei Fenstern hin und her springen können.

Der Button vom Fenster soll immer das andere Fenster in den
Vordergrund holen und auf aktiv setzen.

Auf meiner Recherche bin ich immer wieder
auf deiconify(), raise() und grab() gestossen,
diese funktionieren aber nicht, so wie ich es mir vorstelle.
Woran liegt das? Liegt das vielleicht am KDE?

Gibt es keine Lösung bei der man ein Fenster in Vorgrund holen kann,
ohne das man dafür die anderen Windows minimieren muss?



Hallo "mir",

den Aufruf von iconify kannst du totlegen, den brauchst du nicht. Die
Aufrufe von deiconify sollten drin bleiben, für den Fall, dass der
Benutzer ein Fenster minimiert hat. In sub show_window musst du die
Zeile $kw->focus(); wieder aktivieren, sonnst klappt die Fokusübergabe
nicht.

Achtung: Der Klick auf einen Button wirkt (bei mir) auch, wenn das
Fenster nicht aktiv ist. Wenn man nicht aufpasst, gewinnt man dann
leicht den Eindruck, als würde dein Kode nicht funktionieren. Wenn du
beim Klicken die Maustaste lànger gedrückt hàltst, siehst du, was
passiert: Das Fenster wird aktiv und kommt nach vorn. Beim Loslassen
wird dann der Callback ausgeführt und bringt das andere Fenster wieder
nach vorn. Daher das Flackern.

In Perlskripten solltest du generell use warnings verwenden. Das stößt
dich dann auf deine unorthodoxe Art, auf die Existenz eines Fensters zu
prüfen: Erst das nicht-ex. Fenster verwenden, den Fehler mit eval
abfangen und dann das Fenster erzeugen. In new_window hast du das besser
gemacht (bloß brauchst du es da nicht). Also "unless (Exists($kw)) {
new_window(); }" vor das eval und den print an den Anfang von
new_window. Das eval brauchst du dann nicht mehr (dessen Inhalt aber
schon ;-)

Wenn du Glück hast, funktioniert dann dein Skript. Ganz sicher ist das
nicht, denn in manchen Feinheiten verhàlt sich der Fokus unter Windows
etwas anders als unter Linux. Aber davon solltest du nichts merken.

Gruß

Klaus

Ähnliche fragen