Schrift
[thread]11016[/thread]

Button bei event ausgrauen/disablen

Leser: 3


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Gast Gast
 2007-12-13 16:20
#103828 #103828
Ich habe in meinem Gui eine Listbox und 3 buttons.
2 der Buttons sind standardmäßig disabled/nicht anklickbar.

Wenn in der Listbox eine Zeile mit der Maus angeklickt, oder auf sonstige Weise markiert wird, dann sollen die 2 o.g. Buttons anklickbar werden.
Und wiederum, wenn keine Zeile/Eintrag mehr selektiert ist ,sollen die Buttons wieder disabled werden.


Ich weiß zwar, wie ich mit hilfe von einem Button per Klick einen anderen Button in den Zustand disabled/enabled setzen kann, aber nicht wie man das wie bei dem Listbox selection macht. Vermutlich mit Hilfe irgendwelcher Events oder Listbox-funktionen.
Habe in der Doku dazu leider nichts gefunden, deswegen frage ich jetzt hier in der Hoffnung, dass es hier jemanden gibt, der mir hier weiterhelfen kann.
pktm
 2007-12-13 17:29
#103832 #103832
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Hier ein Beispiel dafür, wie du das Ereignis der Listbox abfängst:

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
#!/Perl/bin/perl

use strict;
use warnings;
use Tk;
use Tk::Listbox;

my $mw = Tk::MainWindow->new(-width => 400, -height => 400,);
$mw->packPropagate(0);

my @werte = qw(1 2 3 4 5 6);

my $listbox = $mw->Scrolled('Listbox',
-scrollbars => 'e',
-height => 5,
-listvariable => \@werte,
)->pack(-side => 'left', -fill => 'y',);

my $label = $mw->Label(-text => 'click a listbox-value', -bg => 'green',)->pack(-fill => 'x',);

$listbox->bind('<<ListboxSelect>>', sub{ $label->configure(-text => $listbox->get($listbox->curselection()),); },);

$mw->MainLoop();


Da wo $label-configure() steht kannst du dann ja deinen Button konfigurieren.

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
Gast Gast
 2007-12-14 10:54
#103870 #103870
Thx für das Beispiel, allerdings hab ich immernoch ein kleines Prob.


Wenn ich ListboxSelect benutze, dann kann ich meine buttons "aktivieren",
aber ich finde keinen Event mit dem ich das Gegenteil bewirken könnte. Also wenn eben nichts mehr selektiert ist, bzw die Listbox garnicht angeklickt ist.


Ich habs schon mit <<FocusIn>> und <<FocusOut>> probiert, aber da passiert dann garnix :(


Hier der Code, den ich verwendet habe:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
$textfield_listing->bind('<<ListboxSelect>>', sub { 
        if ($textfield_listing->curselection()) {
                $button_stop->configure( -state => "normal");
                $button_log->configure( -state => "normal");
                $button_info->configure( -state => "normal");
        }

# ein ListboxDeselect wäre nice, hab aber nichts dazu gefunden :(
} );


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$textfield_listing->bind('<<FocusIn>>', sub { 
        if ($textfield_listing->curselection()) {
                $button_stop->configure( -state => "normal");
                $button_log->configure( -state => "normal");
                $button_info->configure( -state => "normal");
        }
} );


$textfield_listing->bind('<<FocusOut>>', sub { 
        $button_stop->configure( -state => "disabled");
        $button_log->configure( -state => "disabled");
        $button_info->configure( -state => "disabled");

} );



Gibt es vieleicht eine Liste/Tabelle mit allen Events für die jeweiligen Widgets?
in den Perldocs (Tk::bind und Tk::event) gibt es die nicht.
styx-cc
 2007-12-14 12:43
#103874 #103874
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Vollstaendig ist sie glaube ich nicht, aber wenn du ein bisschen rumspielst, bekommst du sicher einiges raus: http://www-users.cs.umn.edu/~amundson/perl/perltk/...
Pörl.
styx-cc
 2007-12-14 13:16
#103875 #103875
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Nicht besonders schoen, aber es funktioniert =)

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
#!/usr/bin/perl -w
use strict;
use Tk;

my $mw = tkinit();
my @werte = qw(1 2 3 4 5 6);
my $listbox = $mw->Scrolled('Listbox',
                           -scrollbars => 'e',
                           -height => 5,
                           -listvariable => \@werte, -exportselection => 1,)
                 ->pack(-side => 'left', -fill => 'y',);
$listbox->bind('<<ListboxSelect>>', sub{check_state()} );

my $b1 = $mw->Button(-text => 'test')->pack;

my $lb2 = $mw->Scrolled('Listbox',
                        -scrollbars => 'e',
                        -height => 5,
                        -listvariable => \@werte,)
             ->pack(-side => 'left', -fill => 'y',);
$lb2->bind('<<ListboxSelect>>', sub{check_state()});

MainLoop;

sub check_state {
  if ($listbox->curselection()) {
    $b1->configure( -state => "normal");
  } else {
    $b1->configure( -state => "disabled" );
  }
}


MfG
Pörl.
Gast Gast
 2007-12-14 13:32
#103881 #103881
hm ja, es funktioniert schon, aber nicht so, wie es soll xD


Das problem ist doch, dass wenn in der Listbox ein selektierter/angeklickter Eintrag ist,
dann sind die Knöpfe zwar aktiv (wie es sein soll), aber wenn dann ein anderes Widget angeklickt wird (und dadurch der selektierte eintrag nicht mehr selektiert ist),
dann bleiben die Knöpfe aktiv, obwohl sie ja dann eigentlich deaktiviert sein sollte.

Also zusammengefasst.
Es wird nur geprüft, wenn die Listbox angeklickt wird.

Eigentlich müsste eben auch noch, sobald die listbox nicht mehr angeklickt ist,
die buttons deaktiviert werden, aber dazu fehlt mir wie schon gesagt das entsprechende Event :(
sowas wie FocusOut eben (oder bei javascript z.b. onMouseOut :D)
styx-cc
 2007-12-14 13:37
#103882 #103882
User since
2006-05-20
533 Artikel
BenutzerIn

user image
"MouseOut" nennt sich unter Tk "Leave", allerdings werden die Eintraege in der Listbox doch nur deselektiert, wenn du welche in einer anderen Listbox selektierst!?
Pörl.
Gast Gast
 2007-12-14 14:29
#103884 #103884
ja genau, mein prog hat inzwischen 2 listboxes
und jedes mal, wenn ich die 2. listbox anklicke, dann wird der eintrag in der ersten listbox deselektiert.

Ganz davon abgesehen wird alle paar sekunden eine funktion ausgeführt, und immer, wenn die ausgeführt wird, deselektiert sich der eintrag in der listbox von alleine oO

Code (perl): (dl )
my $id = $mainwindow->repeat(15000, \&function123);





Und deswegen habe ich halt gedacht, dass es am sinnvollsten wäre, wenn ich bei "focus on" und "focus off" der listbox prüfe, ob was selektiert ist, oder nicht



Also beim anklicken der Listbox sollen (wenn was selektiert ist) die buttons aktiviert werden,
und wenn die listbox nicht mehr aktiv/angeklickt ist, durch welche umstände auch immer, dann sollen die buttons deaktiviert werden
styx-cc
 2007-12-14 14:43
#103885 #103885
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Kannst du mal ein kurzes Script posten, am besten mit function123(), wo man das problem sehen kann?
Pörl.
Gast Gast
 2007-12-17 10:36
#103970 #103970
Ok, hab hier kurz was zusammen gestellt

(zum testen einfach einmal start drücken, eintrag anwählen, dann stop drücken, und dann wieder start)


Teil 1 (2. teil einfach darunter einfuegen)

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
#!/usr/bin/perl
use strict;
use warnings;
use Tk;

my $mw = new MainWindow(-title =>"Test");
my $windowheight = 360;
my $windowwidth = 470;
my $mframe = $mw->Frame();
my $textfield1 = $mframe->ScrlListbox(-scrollbars =>"se", -height => 10, -width => 35);
my $button_start = $mframe->Button(-text =>"Start", -command=>\&start);
my $button_stop = $mframe->Button(-text =>"Stop", -state => "disabled",  -command=>\&stop);
my $button_clear = $mframe->Button(-text =>"Clear",  -command=>\&clear);

my $lframe = $mw->Frame();
my $textfield2 = $lframe->ScrlListbox(-scrollbars=>"se", -height => 6, -width => 62);

$mframe->grid(-row=>1, -column=>1, -rowspan=>10, -columnspan=>4);
$textfield1->grid(-row=>1, -column=>1, -rowspan=>10);
$button_start->grid(-row=>1, -column=>2);
$button_stop->grid(-row=>2, -column=>2);
$button_clear->grid(-row=>3, -column=>2);
$lframe->grid(-row=>11, -column=>1, -rowspan=>2, -columnspan=>2);
$textfield2->grid(-row=>1, -column=>1, -rowspan=>1, -columnspan=>1);

# disable / enable check fuer stop button
$textfield1->bind('<<ListboxSelect>>', sub { 
        if ($textfield1->curselection()) {
                $button_stop->configure( -state => "normal");
        }
        else {
                $button_stop->configure( -state => "disabled");
        }
} );
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2007-12-13 16:20.