Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Perl Tk Insert

by PilotinControl (Pilgrim)
on Feb 17, 2014 at 21:56 UTC ( [id://1075224]=perlquestion: print w/replies, xml ) Need Help??

PilotinControl has asked for the wisdom of the Perl Monks concerning the following question:

Good Evening Monks!
The question based on the code below why does each item appear as a separate drop down list instead of ALL in one drop down list? Thanks in advance!

open(FILE, "DATA/carownerdata.txt"); my @lines=<FILE>; close(FILE); foreach my $lines (@lines) { chomp (@lines); my @owner = split( /\:/, $lines); my @owners = $owner[1]; $personRight->BrowseEntry(-width=>20,-borderwidth=>2, -relief=>'sunken',-textvariable=>\$perInfo->{CAROWNER},state=> +'disabled', -foreground=>'black',-background=>'white')->pack()->insert( 'e +nd', @owners); }

Basically I am trying to pull choices from a file to make a list box however the choices come out in individual list boxes instead of one list box. Have I explained it correctly? Thanks.

Replies are listed 'Best First'.
Re: Perl Tk Insert
by kcott (Archbishop) on Feb 18, 2014 at 07:29 UTC

    G'day PilotinControl,

    Issues with the code you posted:

    • Get into the habit of using lexical filehandes and the 3-argument form of open. The documentation has details.
    • Check that your I/O was actually successful. Either hand-craft code for every I/O operation (open has examples) or use the autodie pragma; the latter is my normal preference as it's both less error-prone and far less work.
    • You read all your data twice (while and for loops). You only need to do this once.
    • I found your use of $lines (plural) confusing on first reading. That variable contains a single line: $line would be more appropriate and less of a maintenance issue.
    • You chomp the array on every iteration of the for loop. You should do this once before you start the loop.
    • You create a Tk::BrowseEntry widget on every iteration of the for loop. You should do this once before you start the loop.
    • See insert() in the Tk::BrowseEntry METHODS section. The syntax is insert(index, string). Your usage of insert(index, array) possibly explains the earlier my @owners = $owner[1]; (which I found confusing when I first encountered it).
    • While you can chain methods (e.g. BrowseEntry->pack->insert), you don't have to. Assign widgets you create to a variable; subsequently, use that variable to invoke methods.

    The following script shows the guts of what you need.

    #!/usr/bin/env perl use strict; use warnings; use Tk; use Tk::BrowseEntry; my $mw = MainWindow->new; my $ctrl_F = $mw->Frame->pack(-side => 'bottom'); $ctrl_F->Button(-text => 'Exit', -command => sub { exit })->pack; my $app_F = $mw->Frame->pack(-side => 'top'); my $be = $app_F->BrowseEntry->pack; while (<DATA>) { chomp; $be->insert(end => (split /:/)[1]); } MainLoop; __DATA__ prefix:Owner A prefix:Owner B prefix:Owner C

    As you can see, although that's very short, it's a working script that you can run (as is). It contains no distracting noise (e.g. widget decorations, foreground/background colours, etc.) and merely addresses the issue at hand. Please attempt to provide something like this when you post your next question.

    -- Ken

      Thanks Ken! I did figure it out using a longer version...your code was much shorter. Thanks.

Re: Perl Tk Insert
by Anonymous Monk on Feb 18, 2014 at 00:31 UTC

    The question based on the code below why does each item appear as a separate drop down list instead of ALL in one drop down list?

    That code doesn't run, but I would guess its because that is what the code tells it to do -- you create browseentry widgets in a loop -- you'll get more than one widget

      Even the following code produces the same output

      open(FILE, "DATA/carownerdata.txt"); my @lines=<FILE>; close(FILE); while ( my $lines = <@lines> ) { chomp (@lines); my @owner = split( /\:/, $lines); $personRight->BrowseEntry(-width=>20,-borderwidth=>2, -relief=>'sunken',-textvariable=>\$perInfo->{CAROWNER},state=> +'disabled', -foreground=>'black',-background=>'white')->pack()->insert( 'e +nd', $owner[1]); }

        Even the following code produces the same output

        Yes, I believe it does, its not much different from the code you originally posted, so they should both do the same thing

        Is that a satisfactory answer? How can I improve my answer?

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1075224]
Approved by ww
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others exploiting the Monastery: (2)
As of 2024-04-24 17:51 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found