Schrift
[thread]4788[/thread]

MainWindow in frame einbetten: Perl/Tk

Leser: 1


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
alexus-777
 2004-06-06 02:03
#42208 #42208
User since
2004-04-13
121 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich möchte dass ein separates Programm(Tk) in einem Anderen Programm(in einem Frame) ausgeführt wird. Gibts Möglichkeiten ein MainWindow in ein Frame zu packen? Hab schon probiert Frame anstatt MW zu benutzen, es werden nicht alle Elemente angezeigt. Ich vermute, dass Frame keine Menüs unterstützt.

Gruß Alexander
Strat
 2004-06-06 02:34
#42209 #42209
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
habe sowas noch nie versucht, aber CPAN:Tk::Toplevel -> -container koennte sowas meinen...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
alexus-777
 2004-06-06 02:43
#42210 #42210
User since
2004-04-13
121 Artikel
BenutzerIn
[default_avatar]
hmm... irgendwie komme ich mit dem -use nicht weiter... leider gibts keine Beispiele zum Thema...
ptk
 2004-06-07 12:48
#42211 #42211
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Hier ist ein Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use Tk;
$mw = MainWindow->new;
$mw->Label(-text => "Hier kommt das eingebettete Fenster:")->pack;
$f = $mw->Frame(-container => 1)->pack;
my $id = $f->id;
warn $id;

$mw->update; # wichtig, Fenster muss gemappt sein!

if (fork == 0) {
$mw2 = MainWindow->new(-use => $id);
$mw2->Label(-text => "Das andere Fenster")->pack;
MainLoop;
CORE::exit();
}

MainLoop;


Statt des geforkten Prozesses kann man auch ein anderes Skript verwenden, man muss nur die Id uebermitteln.
alexus-777
 2004-06-07 14:08
#42212 #42212
User since
2004-04-13
121 Artikel
BenutzerIn
[default_avatar]
Danke! :)
Crian
 2004-06-07 19:38
#42213 #42213
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Bei mir kommt da:

Code: (dl )
1
2
3
4
0x1003a0 at C:\Daten\perl\tk-Programm-in-Programm.pl line 10.
24341b8 is not a hash at C:/Perl/site/lib/Tk/MainWindow.pm line 55.

abnormal program termination


(achja, hab den Code so abgewandelt:

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

my $mw = new MainWindow;
$mw->Label(-text => "Hier kommt das eingebettete Fenster:")->pack();
my $f = $mw->Frame(-container => 1)->pack();
my $id = $f->id;
warn $id;

$mw->update; # wichtig, Fenster muss gemappt sein!

if (fork == 0) {
my $mw2 = MainWindow->new(-use => $id);
$mw2->Label(-text => "Das andere Fenster")->pack();
MainLoop();
CORE::exit();
}

MainLoop();
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ptk
 2004-06-07 19:57
#42214 #42214
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Tk und fork unter Windows scheint dieser Tage problematisch zu sein. Versuch mal, zwei Skripte daraus zu machen und die Window-Id per Argument an das zweite zu uebergeben. Grundsaetzlich sollten -use und -container aber auch unter Windows funktionieren, ich habe jedenfalls nichts Gegenteiliges in der Dokumentation gefunden.
Crian
 2004-06-08 00:43
#42215 #42215
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Och nö ... unter Linux kommt:

Code: (dl )
1
2
3
perl -w tk-Programm-in-Programm.pl
0x3200007 at tk-Programm-in-Programm.pl line 10.
Xlib: unexpected async reply (sequence 0x6b)!



Edit: Ah jetzt! Obiges kam beim Laufen lassen aus SciTE heraus. Direkt von der Konsole funktioniert es :-)

*schick*\n\n

<!--EDIT|Crian|1086641141-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ptk
 2004-06-08 14:05
#42216 #42216
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Hmmm, beim Vergroessern des Fensters sehe ich den Fehler auch. Es macht anscheinend Probleme, wenn man forkt, nachdem das erste MainWindow erzeugt wurde. Folgendes sollte aber funktionieren, vielleicht sogar unter Windows, falls dort pipe() unterstuetzt wird:
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
#!/usr/bin/perl
use strict;
use warnings;
use Tk;

pipe(RDR,WTR);
if (fork == 0) {
close WTR;
chomp(my $id = scalar <RDR>);
close RDR;
my $mw2 = MainWindow->new(-use => $id);
$mw2->Label(-text => "Das andere Fenster")->pack();
MainLoop();
CORE::exit();
}

close RDR;
my $mw = new MainWindow;
$mw->Label(-text => "Hier kommt das eingebettete Fenster:")->pack();
my $f = $mw->Frame(-container => 1)->pack();
my $id = $f->id;
$mw->update; # wichtig, Fenster muss gemappt sein!
print WTR "$id\n";
close WTR;
MainLoop();
Crian
 2004-06-08 17:16
#42217 #42217
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Aus Komodo gestartet:

Code: (dl )
1
2
3
243e488 is not a hash at C:/Perl/site/lib/Tk/MainWindow.pm line 55.

abnormal program termination


Von der Kommandozeile gestartet:

Code: (dl )
1
2
3
1d683dc is not a hash at C:/Perl/site/lib/Tk/MainWindow.pm line 55.

abnormal program termination


(also im Prinzip der gleiche Fehler)

Unter Linux: kommt das Fenster wie gewohnt, allerdings lässt sich auch die Größe ändern (hab ich bei der ersten Variante ehrlich gesagt gar nicht ausprobiert.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2004-06-06 02:03.