Schrift
[thread]5357[/thread]

return von subroutine mit frame



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
theresa
 2007-07-17 14:19
#46629 #46629
User since
2007-07-17
90 Artikel
BenutzerIn
[default_avatar]
Ich muss mit einem Frame Daten abfragen, in ein Array speichern und zurückgeben.

Hab den Code auf das Minimale beschränkt, wo der Fehler auftaucht...

Der sieht so aus
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@array = subr();
foreach(@array){print $_};

sub subr{
my $mw = new MainWindow;
my $frame = $mw -> Frame() -> pack();
my $ok_but = $frame -> Button(-text=>"Ok", -command =>\&subr2) -> pack();
MainLoop;

sub subr2{
@array = (1, 2, 3);
$mw -> destroy();
return @array;
}
}


Als Rückgabe hätte ich gerne das Array, kommt aber eine 0 raus.
Was nicht passiert ohne Frame usw.
Deswegen denke ich, dass das Frame meine Rückgabe mit einer Erfolgsmeldung überschreibt, oder so etwas in der Art.
Kann mir jemand sagen wie ich das Array aus dieser Subroutine holen kann?

Danke
styx-cc
 2007-07-17 15:44
#46630 #46630
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Hi,
benutze bitte strict und warnigs.
Hab dir den Code mal so umgeschrieben das er macht was du willst, aber irgendwie erkenne ich keinen richtigen Sinn..

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/perl
use strict;
use warnings;
use Tk;

my @array = subr();
foreach (@array){print $_};

sub subr{
my $mw = tkinit();
my @array;
my $frame = $mw -> Frame() -> pack();
my $ok_but = $frame -> Button(-text=>"Ok", -command => sub{@array = subr2($mw);}) -> pack();
MainLoop;
return @array;

sub subr2{
my $mw = shift;
my @array = (1, 2, 3);
$mw -> destroy();
return @array;
}
}


Edit:
Du kannst ja vielleich erklaeren was du vorhast, dann bekommen wir das bestimmt sauberer hin =)

MfG\n\n

<!--EDIT|styx-cc|1184672753-->
Pörl.
theresa
 2007-07-17 17:58
#46631 #46631
User since
2007-07-17
90 Artikel
BenutzerIn
[default_avatar]
Gut!

Vorhaben ist ein kleines Anmeldefenster, wo man seinen Benutzernamen und Passwort einträgt.

Danach müssen diese Daten bei einem Server überprüft werden usw.
Kenne mich mit Perl eher nicht aus, tut mir leid wenn mein Code grundsätzlich schrecklich ist.

Ich füge einfach den Code vom Fenster ein, sowie ich es am Anfang hatte... vielleicht kann man alles anders machen.

Code: (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
@angaben = anmeldeFenster();
foreach(@angaben){print $_};

sub anmeldeFenster {
my $mw = new MainWindow;
my $image = $mw->Photo(-file=>"d:/logo.gif");
$mw->iconimage($image);
my $frame = $mw -> Frame() -> pack();
my $user_lab = $frame -> Label(-text=>"Benutzer: ")-> pack();
my $ben_feld = $frame -> Entry() ->pack();
my $pass_lab = $frame -> Label(-text=>"Passwort: ") -> pack();
my $pass_feld = $frame -> Entry(-show=>'*') -> pack();
$pass_feld->bind('<Return>', \&ok_button);
my $ok_but = $frame -> Button(-text=>"Ok", -command =>\&ok_button) -> pack();
MainLoop;

sub ok_button{
$benutzer = $ben_feld -> get();
$passwort = $pass_feld -> get();
@angaben = ($benutzer, $passwort);

$mw -> destroy();

return @angaben;
}

}
\n\n

<!--EDIT|theresa|1184680732-->
renee
 2007-07-17 19:13
#46632 #46632
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du brauchst Da kein MainWindow zu machen...

Ich hatte mir mal so etwas geschrieben:


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
package Tk::UserPassword;

#
#  Copyright (c) 2005 Renee Baecker (module@renee-baecker.de)
#

use 5.006001;
use strict;
use warnings;
use Carp;

require Tk;
require Tk::Toplevel;
require Exporter;

our @ISA     = qw(Exporter);
our $VERSION = '0.01';
our @list    = ();

sub Show{
  my ($self) = @_;
  my $cw = $self->{cw};
  $cw->Popup();
  $cw->waitVariable(\$cw->{Selected});
  $cw->withdraw;
  $cw->{Selected} = [""] unless(defined $cw->{Selected});
  return wantarray ? @{$cw->{Selected}} : join("; ",@{$cw->{Selected}});
}# Show

sub Accept{
  my ($cw) = @_;
  my $user = $cw->Subwidget('user_frame')->Subwidget('user')->get();
  my $pass = $cw->Subwidget('password_frame')->Subwidget('password')->get();
  $cw->{Selected} = [$user,$pass];
  $cw->{Selected} = [""] unless($user || $pass);
}# Accept

sub Cancel{
  my ($cw) = @_;
  $cw->{Selected} = undef;
  $cw->withdraw;
}#Cancel

sub new{
  my ($class,$cw,%args) = @_;
  my $self = {};
  bless($self,$class);
  
  my $top = $cw->Toplevel(%args);
  $top->protocol('WM_DELETE_WINDOW' => [\&Cancel, $top]);
  
  # User Frame  
  my $entry_var = '';
  my $user_frm = $top->Component('Frame' => 'user_frame')->pack(-expand => 1, -fill => 'both');
  $user_frm->Label(-text => 'User: ')->pack(-anchor => 'w', 
               
               
              -side&
nbsp;  => 'left',);
  $user_frm->Component('Entry'       => 'user',
               
        -textvariable => \$entry_var,
               
       )->pack(-anchor => 'e',
               
               
-side   => 'right',);
  
  # Password Frame  
  my $password_var = '';
  my $pass_frm = $top->Component('Frame' => 'password_frame')->pack(-expand => 1, -fill => 'both');
  $pass_frm->Label(-text => 'Password: ')->pack(-anchor => 'w', 
               
               
               
   -side   => 'left',);
  $pass_frm->Component('Entry'       => 'password',
               
        -textvariable => \$password_var,
               
        -show         => '*',
               
       )->pack(-anchor => 'e',
               
               
-side   => 'right',);
  
  # ok-Button
  $top->Button(-text => 'ok', -command => [\&Accept,$top])->pack();
  
  $self->{cw} = $top;
  return $self;
}# Populate

1;


Dann im Skript:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl

use strict;
use warnings;

my $mw = tkinit();
# der andere Tk-Kram
MainLoop;

sub irgendein_callback{
    my $up = Tk::UserPassword->new;
    my ($user,$pass) = $up->Show();
}


}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2007-07-17 19:15
#46633 #46633
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das Board hat ein paar "&nbsp;"s eigefügt, die da nicht reingehören...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
theresa
 2007-07-28 22:45
#46634 #46634
User since
2007-07-17
90 Artikel
BenutzerIn
[default_avatar]
ok, danke

z.z. weiß ich nur nicht wie ich das mit dem Tk::UserPassword machen soll

musst die UserPassword datei in Tk Verzeichnis kopiert werden?

oder gibt es ein befehl, oder so, womit die pl datei das modul "nur so" findet?
renee
 2007-07-29 11:48
#46635 #46635
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Beispiel Ordnerstruktur:

Code: (dl )
1
2
3
4
+ skript.pl
+ perllib
+ Tk
+ UserPassword.pm


Skript:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

use strict;
use warnings;
use Tk;
use lib qw(./perllib);
use Tk::UserPassword;

my $mw = tkinit();
# der andere Tk-Kram
$mw->Button( -command => \&irgendein_callback, -text => 'Klick mich' )->pack;
MainLoop;

sub irgendein_callback{
    my $up = Tk::UserPassword->new($mw);
    my ($user,$pass) = $up->Show();
    print $user, " :: ", $pass;
}


Das habe ich gerade sogar getestet...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2007-08-07 13:18
#97639 #97639
hi,
bei mir lief es auch...

würde aber gerne auf das erste Fenster verzichten...

das habe ich auch versucht, indem ich den tkinit() im konstruktor benutzt habe...

der skript würde dann nur
Code: (dl )
1
2
my $up = Tk::UserPassword->new();
my ($user,$pass) = $up->Show();

enthalten. jetzt weiß ich aber nicht wo das MainLoop hingehört.

im skript aufgerufen kommt man nicht wieder raus.
außerdem wird dann sowieso ein zweites fenster angezeigt

oder im modul... aber wo?

Habe eine zweite frage, viel allgemeiner
danach dass man ein objekt mit new() erzeugt hat, und es mit einem print ausgibt, wird der "richtige" name ausgegeben (in diesem fall UserPassword),

aber wenn ich wieder nach seiner identität innerhalb der methoden frage, mit @_. oder shift... ist es nur TopLevel, oder MainWindow, je nachdem was man gerade benutzt... wieso das?
theresa
 2007-08-07 13:21
#97640 #97640
User since
2007-07-17
90 Artikel
BenutzerIn
[default_avatar]
der gast bin ich

wollte noch großen dank für die hilfe bisher sagen =)
renee
 2007-08-07 13:26
#97641 #97641
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Da muss ich mir erstmal das Modul wieder genauer anschauen... Und mal probieren, ob ich das irgendwie hinbekomme...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2007-07-17 14:19.