in reply to Resolved: tk widget - How to hide and unhide the forms in my script

Your code worked well enough for me to see the direction that you are going. Some suggestions: Hope this helps.
#!/usr/local/bin/perl use strict; use warnings; use Tk; my $mainwindow = MainWindow->new(); $mainwindow->geometry("600x150"); $mainwindow->title("Add/Delete/Reset Password"); # Disable the window Resize # $mainwindow->resizable(0,0); # Why??? don't need it? my $main_menu = $mainwindow->Menu(); $mainwindow->configure(-menu => $main_menu); # File my $menu_menu = $main_menu->cascade(-label=>"Menu", -underline => 0, - +tearoff=>0); $menu_menu->command(-label=>"Password Reset for users", -underline= +>0, -command=>\&Show_ResetPassword_menu); $menu_menu->command(-label=>"Add User", -underline=>0, -command=>\& +Show_AddUser_menu); $menu_menu->command(-label=>"Delete User", -underline=>0, -command= +>\&Show_DeleteUser_menu); # About $main_menu->command(-label=>"About", -command=>sub{$mainwindow->messageBox(-title=> "Ab +out", -message=>"Version 3.0.0", -type => "ok")}); MainLoop(); my $user; sub password_reset { my $answer = $mainwindow -> messageBox( -message=>"Password Reset for user: $user", -title=> "Password", -type=>"YesNoCancel", -icon=>"info"); if ($answer =~ /yes/i) { # code to reset password goes here.... # whatever log messasges you want print "PASSWORD RESET SUCEEDED: $user\n"; # a log entry? } else { print "PASSWORD RESET ABORTED: $user\n"; # a log entry? } } sub Show_ResetPassword_menu { my $label_resetp = $mainwindow->Label(-text=>"Password Reset for u +ser ", -width => 40) -> pack ( -side=>'left'); my $entry_resetp = $mainwindow->Entry(-width => 30, -textvariable +=>\$user )->pack(-side => 'left'); $entry_resetp->bind("<Return>", \&password_reset); my $button = $mainwindow->Button(-text=>"Click to reset", -command + => \&password_reset , -width => 15) -> pack ( -side=>'bottom' ); } # more code modifications to be done by poster.... sub add_user { my $answer = $mainwindow -> messageBox( -message=>"Add user: $user", -title=> "Password", -type=>"ok", -icon=>"info"); } sub Show_AddUser_menu { my $label_adduser = $mainwindow->Label(-text=>"Add user ", -width +=> 40) -> pack ( -side=>'left'); my $entry_adduser = $mainwindow->Entry(-width => 30)->pack(-side = +> 'left'); # $entry_adduser->bind("<Return>", \$adduser_handle_return); my $button = $mainwindow->Button(-text=>"Click to reset", -command + => \&adduser, -width => 15) -> pack ( -side=>'bottom' ); } sub Show_DeleteUser_menu { my $deleteuser_handle_return; my $label_deleteuser = $mainwindow->Label(-text=>"Delete User ", -widt +h => 40) -> pack ( -side=>'left'); my $entry_deleteuser = $mainwindow->Entry(-width => 30)->pack(-side => + 'left'); $entry_deleteuser ->bind("<Return>", \$deleteuser_handle_return); my $button = $mainwindow->Button(-text=>"Click to reset", -command => +\$deleteuser_handle_return, -width => 15) -> pack ( -side=>'bottom' ) +; $deleteuser_handle_return = sub { $mainwindow -> messageBox( -message=>"Delete User", -title=> "DELETE", -type=>"ok", -icon=>"info"); } }

Replies are listed 'Best First'.
Re^2: tk widget - How to hide and unhide the forms in my script
by fsmendoza (Novice) on Mar 02, 2017 at 09:42 UTC

    Dear Discipulus & Marshall,

    I appreciate your time and effort in reading and sharing some info. I have tried the script you two shared however I still could not achieve my two goal. maybe I rephrase it again hope I can explain it clearly.

    -------

    Item-A.) What I want to do is when I click the option in GUI TK window form " Menu->Add user " it will load 3 objects one for each (Label, Entry, & Button) inside my MainWindow form.

    Item-B.) When I click again the option in my GUI TK window form " Menu-> Reset User " It will clear the old form from Item-A and load new 3 objects again one for each Label, Entry and Button) in my MainWindow.

    This means that before I select new option Menu it will clear my MainWindow form and load option that I have selected. Just like the normal GUI behavior when using some application when clicking other options menu it will clear the previous(old) view and load again the next option that was just selected or click.

    Thank you in advance

      You obviously didn't understand my first point. You need to use more frames. Frames are like invisible boundaries which are packed just like any other object. You have 3 menu choices. I would make 3 frames, one for each choice. Each choice has 3 objects, a label, entry window, button. To display a frame, pack it into Mainwindow or perhaps another frame. To remove a frame from view, unpack it. I don't have time to write the code right now, but that should work. At any time, you will have zero or one of the 3 "choice frames" packed and view-able.

      To clear the entry window, set the -textvariable variable to a null string.

      Try the above and see what happens.

      Update: I used the wrong terminology, instead of "unpack()", use "packForget()". My idea was correct, but name was wrong. Use "packForget" to remove an object from being displayed. I did a quick hack to my previously posted code, only for the "reset password" menu. See Below.

      Click on Menu->password reset option, gives display of the reset objects, enter a user, hit ok on the confirmation pop-up, that will print to stdout and also clear the 3 reset objects in the window. Going through Menu->password reset option again will repeat this behavior. Note the reset to the $user variable.

      Homework for the OP: Make more Frames. Probably a MenuFrame and at perhaps even a "work frame" packed into the MainWindow. You can make a frame for each of the menu options. Then pack() or packForget() those frames into either the "work frame" or the Mainwindow to show or not show them. In my hack I just directly packForget() each of the individual widgets, don't do that. Use a frame to group them together. My code is just "proof of concept", not finished code. There are hide and un-hide options for entire windows.

      #!/usr/local/bin/perl use strict; use warnings; use Tk; my $mainwindow = MainWindow->new(); $mainwindow->geometry("600x150"); $mainwindow->title("Add/Delete/Reset Password"); # Disable the window Resize # $mainwindow->resizable(0,0); # Why??? don't need it? my $main_menu = $mainwindow->Menu(); $mainwindow->configure(-menu => $main_menu); # File my $menu_menu = $main_menu->cascade(-label=>"Menu", -underline => 0, - +tearoff=>0); $menu_menu->command(-label=>"Password Reset for users", -underline= +>0, -command=>\&Show_ResetPassword_menu); $menu_menu->command(-label=>"Add User", -underline=>0, -command=>\& +Show_AddUser_menu); $menu_menu->command(-label=>"Delete User", -underline=>0, -command= +>\&Show_DeleteUser_menu); # About $main_menu->command(-label=>"About", -command=>sub{$mainwindow->messageBox(-title=> "Ab +out", -message=>"Version 3.0.0", -type => "ok")}); my $label_resetp; my $entry_resetp; my $button_resetp; MainLoop(); my $user; #text vasriable sub password_reset { my $answer = $mainwindow -> messageBox( -message=>"Password Reset for user: $user", -title=> "Password", -type=>"YesNoCancel", -icon=>"info"); if ($answer =~ /yes/i) { # code to reset password goes here.... # whatever log messasges you want print "PASSWORD RESET SUCEEDED: $user\n"; # a log entry? } else { print "PASSWORD RESET ABORTED: $user\n"; # a log entry? } $user=''; # clear the user name entry field $label_resetp->packForget(); $entry_resetp->packForget(); $button_resetp->packForget(); } sub Show_ResetPassword_menu { $label_resetp = $mainwindow->Label(-text=>"Password Reset for user + ", -width => 40) -> pack ( -side=>'left'); $entry_resetp = $mainwindow->Entry(-width => 30, -textvariable =>\ +$user )->pack(-side => 'left'); $entry_resetp->bind("<Return>", \&password_reset); $button_resetp = $mainwindow->Button(-text=>"Click to reset", -com +mand => \&password_reset , -width => 15) -> pack ( -side=>'bottom' ); } sub add_user { my $answer = $mainwindow -> messageBox( -message=>"Add user: $user", -title=> "Password", -type=>"ok", -icon=>"info"); } sub Show_AddUser_menu { my $label_adduser = $mainwindow->Label(-text=>"Add user ", -width +=> 40) -> pack ( -side=>'left'); my $entry_adduser = $mainwindow->Entry(-width => 30)->pack(-side = +> 'left'); # $entry_adduser->bind("<Return>", \$adduser_handle_return); my $button = $mainwindow->Button(-text=>"Click to reset", -command + => \&adduser, -width => 15) -> pack ( -side=>'bottom' ); } sub Show_DeleteUser_menu { my $deleteuser_handle_return; my $label_deleteuser = $mainwindow->Label(-text=>"Delete User ", -widt +h => 40) -> pack ( -side=>'left'); my $entry_deleteuser = $mainwindow->Entry(-width => 30)->pack(-side => + 'left'); $entry_deleteuser ->bind("<Return>", \$deleteuser_handle_return); my $button = $mainwindow->Button(-text=>"Click to reset", -command => +\$deleteuser_handle_return, -width => 15) -> pack ( -side=>'bottom' ) +; $deleteuser_handle_return = sub { $mainwindow -> messageBox( -message=>"Delete User", -title=> "DELETE", -type=>"ok", -icon=>"info"); } }

        Dear Marshall,

        Thank you so much for sharing your code and it was great. and its working now compare to my code So when I type something and hit enter or press reset it will clear the current form to blank window and I can select again new options without any issue

        my new assignement now is I'm looking to enhance the TK gui form script that I created. Because if you run the script and I click the 'File->Add user' then suddenly for example I change my mind to click 'File-Reset user' instead. The label description will display on top of each other.

      maybe Tk::NoteBook can be of interest?

      L*

      There are no rules, there are no thumbs..
      Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.