Thread Tk: Toplevel funktioniert nicht bei 2tem Aufruf
(9 answers)
Opened by Juergen at 2011-03-02 08:51
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) |