Thread Tk: Toplevel funktioniert nicht bei 2tem Aufruf (9 answers)
Opened by Juergen at 2011-03-02 08:51

Gast Juergen
 2011-03-02 08:51
#146176 #146176
Hallo zusammen,

leider muss ich wieder eure Hilfe in nspruch nehmen.
Ich beutze Tk zumerstellen meiner GUI.
Wenn ich einen Button bediene (als drücke) springe ich in eine sub und erzeuge mir hier ein Toplevel-Widget von $mw.
Das Toplevel hat wiederum andere Widgets wie MListBox und Buttons usw.
Wenn das Toplevel zum ersten mal gestartet wird, funktioniert alles einwandfrei.
Über einen Button "quit" rufe ich ein toplevel->destroy(); auf und das Toplevel ist weg.
Rufe ich aus dem MainWindow per Button-Click das Toplevel erneut auf, so funktioniert das Toplevel nicht mehr: es wird zwar angezeigt, aber sämtliche sub's innerhalb funktionieren nicht mehr :(

Was mach ich den falsch?
Kann ein Toplevel immer nur einmal aufgerufen werden? Das wär ja ganz schön doof...

Bitte um Hilfe

Anbei die Sub in das das Toplevel erstellt und die Datenbearbeitet werden:
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
sub edit_times{
        # diese Funktion öffnet ein neues Toplevel-Widget
        # hier können bereits eingetragene Zeiten bearbeitet werden und
        # neue Tätigkeiten angelegt werde
        tie my @arr_data_set_timefile, 'Tie::File', $file_name_path_act_month or die $!;
        my @arr_ref_mlistbox_timedata = tied_times_to_2d_array_ref(\@arr_data_set_timefile);
        untie @arr_data_set_timefile;
        
        my $toplevel_edit_times = $mw->Toplevel(
                -title => 'Times in file',
                -background => 'white',
        );
        $toplevel_edit_times->transient($mw);
        $toplevel_edit_times->focusForce();
        $toplevel_edit_times->geometry('1000x500'); 
        my $MListbox_edit_times = $toplevel_edit_times->Scrolled('MListbox',
                -columns=>[
                        [-text=>'Datum Beginn' ,-width=>14], #, -comparecommand => sub { $_[0] <=> $_[1]}],
                        [-text=>'Uhrzeit Beginn', -width => 14],
                        [-text=>'Projekt', , -width => 24],
                        [-text=>'Arbeitspaket', -width=>25],
                        [-text=>'Task', -width => 50],
                        [-text=>'Datum Ende', -width => 14],
                        [-text=>'Uhrzeit Ende', -width => 14],#, -comparecommand => sub { $_[0] <=> $_[1]}],
                ],
                -takefocus => 1,
        )->pack(-fill => 'both', -expand => 1, -side => 'top');

        my $Frame_edit_times_workplace = $toplevel_edit_times->Frame()->pack(-fill=>'x', -expand=>1, -side=>'top');
        my $Entry_Date = $Frame_edit_times_workplace->LabEntry(-label=>'Datum', -width=>10)->pack(-side=>'left');
        my $Entry_Time_start = $Frame_edit_times_workplace->LabEntry(-label=>'Beginn', -width=>6)->pack(-side=>'left');
        my $Entry_Time_stop = $Frame_edit_times_workplace->LabEntry(-label=>'Ende', -width=>6)->pack(-side=>'left');
        my $JBrowseEntry_edit_times_Projects = $Frame_edit_times_workplace->JBrowseEntry(
                -label => 'Projekt:',
                -labelPack => [-side => 'top', -anchor => 'e'],
                -variable => \$project_selected,
                -state => 'normal',
                -choices => [@arr_projects,keys(%hoa_additionals)],
                -width  => 12,
                -browsecmd => \&set_JBrowseEntry_choices,
                -tabcomplete => 1,
        )->pack(
                -side   => 'left',
                -pady => '2',
                -anchor => 'w'
        );
        my $JBrowseEntry_edit_times_Workpackages = $Frame_edit_times_workplace->JBrowseEntry(
                -label => 'Workpackage:',
                -labelPack => [-side => 'top', -anchor => 'e'],
                -variable => \$workpackage_selected,
                -state => 'normal',
                -choices => \@arr_work_packs,
                -width  => 20,
                #-validate => 'focusin',
                #-validatecommand => \&set_JBrowseEntry_choices,
        )->pack(
                -side   => 'left',
                -pady => '2',
                -anchor => 'w'
        );
        my $Entry_Task = $Frame_edit_times_workplace->LabEntry(-label=>'Task')->pack(-fill=>'x', -expand=>1, -side=>'left');
        my $Frame_edit_times_buttonmenue = $toplevel_edit_times->Frame()->pack(-fill=>'x', -expand=>1, -side=>'top');
        my $Button_new_task = $Frame_edit_times_buttonmenue->Button(-text=>'add new task', -command=>\&add_new_task)->pack(-padx=>'2', -pady=>'2', -side=>'left',);
        my $Button_quit_edit_task = $Frame_edit_times_buttonmenue->Button(-text=>'quit', -command=>[\&quit_edit_times, \$toplevel_edit_times])->pack(-padx=>'2', -pady=>'2', -side=>'left', );
        $MListbox_edit_times->bindRows("<Button-1>",\&get_mlistbox_cur_selection);

        fill_mlistbox(\$MListbox_edit_times);

        my @arr_ref_time_data;
        foreach my $cur_line (@arr_data_set_timefile){
                print $;
        }
        my $index_cur_selection;
        sub get_mlistbox_cur_selection{
                $index_cur_selection = $MListbox_edit_times->curselection();
                # hole die Einträge der Selektion der MListbox
                my @arr_cur_sel = $MListbox_edit_times->getRow($index_cur_selection);
                # Lösche die alten Eintraege
                $Entry_Date->delete(0,'end');
                $Entry_Time_start->delete(0,'end');
                $Entry_Time_stop->delete(0,'end');
                $Entry_Task->delete(0,'end');
                # Trage die markierten Daten ein:
                $Entry_Date->insert('end',$arr_cur_sel[0]);
                $Entry_Time_start->insert('end',$arr_cur_sel[1]);
                $JBrowseEntry_edit_times_Projects->activate(get_mlistbox_choice_index(\$JBrowseEntry_edit_times_Projects,$arr_cur_sel[2]));
                $JBrowseEntry_edit_times_Workpackages->activate(get_mlistbox_choice_index(\$JBrowseEntry_edit_times_Workpackages,$arr_cur_sel[3]));
                $Entry_Task->insert('end',$arr_cur_sel[4]);
                $Entry_Time_stop->insert('end',$arr_cur_sel[6]);
        }

        sub add_new_task{
                # übernimmt die Eingaben und hängt sie einfach an die Zeitliste an
        }

        sub fill_mlistbox{
                my $listbox_widget = shift;
                ${$listbox_widget}->delete(0,'end');
                ${$listbox_widget}->insert('end',@arr_ref_mlistbox_timedata);
        }

        sub get_mlistbox_choice_index{
                # diese Funktion bekommt einen String und sucht die Index-Nummer
                # der Auwahl-Liste des übergebenen Stings
                my $ref_jbe = shift;
                my $string_value = shift;
                my $index=-1;
                my @arr_mlistbox_choices = ${$ref_jbe}->choices();
                my $counter=0;
                foreach my $cur_elem (@arr_mlistbox_choices){
                        DEBUG "Vergleiche ".$string_value." mit ".$cur_elem."\n"." und Index ist z.Zt. ".$index;
                        if($string_value eq $cur_elem){
                                $index = $counter;
                        }
                        $counter++;
                }
                return($index);
        }
        
        sub quit_edit_times{
                sort @arr_data_set_timefile;
                untie @arr_data_set_timefile;
                $toplevel_edit_times->destroy if Tk::Exists($toplevel_edit_times);
        }
}


Danke und Grüße
Jürgen
Last edited: 2011-03-02 10:22:52 +0100 (CET)

View full thread Tk: Toplevel funktioniert nicht bei 2tem Aufruf