Previous
Hello World 
Next
Frame, Text, Scrollbar, Scale 
Perl/Tk Tutorial - Create GUI with Perl's Tk Module
Button, Entry, Label

Widgets 1 : Button, Entry, Label

A widget is a user interface object in X graphical user interfaces. Confused? Lets just say that it is the name of the object that appears on screen. There are many types widgets. If you want to display a button, you use the button widget. For text, you use the text widget. For entry, you guessed it, the entry widget.
Syntax:
my $WidgetVariable = $Window -> WidgetType(?Option 1=>Value 1, ?Option 2=>Value 2 ...??) -> pack();

Three things need to be said about widgets. First is the widget variable. This I have explained earlier. The widget variable of all widgets must be unique and will be used whenever that widget needs to be accessed. Second is the options. Each widget has some options which can be used to configure it. This is usually done when the widget is declared, but it can be done afterward also. The final thing is commands. Each widget has some commands which also can be used to configure it or make it do some thing.

But before we begin, we need to know a little about the pack command. I have explained this earlier but just doing it one more time so that you don't have to push the back button. Pack is a geometry manager. Another geometry manager is 'grid' - we will explore that latter. Pack is much more simpler than grid.
The line $hello -> pack; tells the interpreter to pack the widget called "$hello".


Button

This will make a button. It can be configured to execute some code when the button is pushed. This will usually refer to a function so when the button is pushed, the function will run. An button is shown below. This button is created using HTML input tag.

Some Options
-text=>"TEXT" TEXT will be the text displayed on the button
-command=>CALLBACK CALLBACK will be the code that is called when the button is pushed

#!/usr/local/bin/perl
use Tk;

# Main Window
my $mw = new MainWindow;

my $but = $mw -> Button(-text => "Push Me", 
		-command =>\&push_button);
$but -> pack();

MainLoop;

#This is executed when the button is pressed 
sub push_button {
	... whatever ...
}

You may have noticed that I used a slash(\) in the command callback (-command =>\&push_button);). Make sure that the slash stays there - to see why, go to the Most common mistakes by Perl/Tk beginners.


Entry

An entry is a widget that displays a one-line text string and allows the user to input and edit text in it. When an entry has the input focus it displays an insertion cursor to indicate where new characters will be inserted. An entry element is shown using HTML.

Some Options
-width=>NUMBERWidth of the input field. NUMBER should be an integer.
-textvariable=>\$VARIABLEThe contents of the variable VARIABLE will be displayed in the widget. If the text in the widget is edited, the variable will be edited automatically.
-state=>STATE The state of the input field. It can be normal, disabled, or readonly. If it is readonly the text can't be edited.
Some Commands
SyntaxDescriptionExample
$widget -> get(); The text inside input field can be taken by this command $name = $ent -> get();
$widget -> delete(FIRST?,LAST?); Delete one or more elements of the entry. FIRST is the index of the first character to delete, and LAST is the index of the character just after the last one to delete. If last isn't specified it defaults to FIRST+1, i.e. a single character is deleted. This command returns an empty string. $ent -> delete(0,'end');
$widget -> insert(index,"STRING"); Insert the characters of STRING just before the character indicated by index. Index is 0 for the first character. The word "end" can be used for the last character $ent -> insert('end',"Hello");

Example

#!/usr/local/bin/perl
use Tk;

# Main Window
my $mw = new MainWindow;

#GUI Building Area
my $ent = $mw -> Entry() -> pack();
my $but = $mw -> Button(-text => "Push Me", 
		-command =>\&push_button);
$but -> pack();

MainLoop;

#This is executed when the button is pressed 
sub push_button {
	$ent -> insert('end',"Hello");
}

Label

This widget display text messages.

Some Options
-text => "TEXT"TEXT will be the text displayed on the button
-font => FONTSpecifies the font to use when drawing text inside the widget. You can specify just the font or you can give it in this format "FONTNAME SIZE STYLE". The STYLE can be bold, normal etc.

Example

#!/usr/local/bin/perl
use Tk;

my $mw = new MainWindow; # Main Window

my $lab = $mw -> Label(-text=>"Enter name:") -> pack();
my $ent = $mw -> Entry() -> pack();
my $but = $mw -> Button(-text => "Push Me", 
		-command =>\&push_button);
$but -> pack();

MainLoop;

#This is executed when the button is pressed
sub push_button {
	$ent -> insert(0,"Hello, ");
}
Previous
Hello World 
Next
Frame, Text, Scrollbar, Scale 

Comments

Anonymous at 31 Jul, 2007 02:49
The example above with the function push_button is not showing the text "whatever". Also if i use the command use strict,how do i write the bare text whatever
Reply to this.
Binny V A at 01 Aug, 2007 06:19
No - you misunderstood me. That 'whatever' is not the output - I meant you can put the code you want in its place. On hindsight, I think I should have commented it.
Reply to this.
Anonymous at 31 Jul, 2007 04:31
I think the function body(sub) should be written inside MainLoop itself. I had posted the same question and I think the answer is this description.
Reply to this.
Jack at 01 Aug, 2007 03:17
Is there a command to toggle the visibility of a widget? preferably label and entry widgets
Reply to this.
Binny V A at 01 Aug, 2007 06:28
There is the destroy() function that will delete a widget.

my $lab = $mw -> Label(-text=>"Enter name:") -> pack();
$lab->destroy();
Reply to this.
ANGIE at 08 Sep, 2007 04:52
YOUR CODE IS SO GREAT. YOU SHOULD START A PAID CERTIFICATION COURSE.
YOU ROCK , MAN!
Reply to this.
Anonymous at 21 Sep, 2007 11:38
As they say in Shakespeare's time, "You da Man Home-Slice"! Thanks for this!
Reply to this.
Anonymous at 21 Sep, 2007 11:43
Do you have an example of a button that the "-state" changes from "disabled" to "normal" after some event?
The following didn't work for me.

my $Enable_button="disable";
......

$mw->-> Button(-text => "Push Me",
-command =>\&push_button);
-state => $Enable_button,
or
-state => \$Enable_button,
$but -> pack();
.......
then, later
$Enable_button = "normal";

Reply to this.
Binny V A at 22 Sep, 2007 01:15
The right way to do this is...
my $button = $wm-> Button(-text => "Push Me", -command =>\&push_button, -state=>"normal");

Later
$button->configure(-state=>'disabled');
Reply to this.
Paul R at 24 Sep, 2007 07:11
Binny VA.
That's it. Thanks for your help
Reply to this.
Sibu.N.L at 11 Mar, 2008 12:59
Binny,

When I run a perl/TK simple hello world application by double clicking on it
under windows xp,
a command window also opened along with the hello world application window.
How to avoid or hide the command window from appearing on screen

Thanks in advance,

Sibu.N.L
Reply to this.
Binny V A at 11 Mar, 2008 03:53
I don't think you can do anything about that.
Reply to this.
Kerbiquet at 18 Mar, 2008 04:07
Hi,

Check this example, taken from the Perl Cookbook edited by O'Reilly: www.oreilly.com/catalog/perlckbk2/toc.html

The windows console pops up by diseappear immediatly.
Reply to this.
Kerbiquet at 18 Mar, 2008 06:33

You have written a Perl program for the Windows port of Perl and Tk, but you get a DOS shell window every time you start your program.
Add this to the start of your program:

BEGIN {
if ($^O eq 'MSWin32') {
require Win32::Console;
Win32::Console::Free( );
}
}

The Win32::Console module lets you control the terminal window that launched your program. All you need to do is close that window (or Free it in, in the peculiar parlance of the Windows API) and voila no pesky DOS shell window.
The documentation for the Win32::Console module, which is included with distributions of Perl destined for Microsoft systems
Reply to this.
Anonymous at 20 Mar, 2008 09:21
Entry() takes a 1-line input..wat to do if i want t to capture a text area as input & manipulaate it..?
Reply to this.
Binny V A at 21 Mar, 2008 03:59
Its in the next page - Text widget.
Reply to this.
Anonymous at 06 May, 2008 01:29
can you please tell me how can i delete or make the scrolledlistbox invisible in the main window?
I am developing 1 application in TK(VTcl)
Reply to this.
Comment


Comment




Comment Formating : HTML tags a, strong, em, b, i, code, pre, p and br allowed. Other tags will be shown as code(< will become &lt;). Urls, Line breaks will be auto-formated.
Subscribe to Feed