PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl TK - "Datei-> Öffnen" Dialogfeld



TB09
03-07-2009, 09:19
Hallo zusammen!

Ich habe folgendes Problem:

Ich möchte mit Perl/TK ein GUI erzeugen mit dem man unter anderem auch Dateien öffnen kann, wie man es aus allen gängigen Programmen kennt.

Die Menüleits ist kein Problem, aber wenn ich nun auf Datei->Öffnen gehe, möchte ich, dass das Dialogfeld zum auswählen der Datei erscheint.
Dafür muss es doch schon perl-module oder ähnliches geben, so dass man das Dialogfeld nicht selbst programmieren muss. Gleiches gilt auch für Datei->Speichern etc.

Kann mir irgendjemand helfen und mir sagen, ob und falls ja, wo solche Standard GUIs zu finden sind.

Vielen herzlichen Dank!

Gruß, Thomas

reneeb
03-07-2009, 09:40
my @pdf_type = (['PDF files', '.pdf',],['PDF files', '.PDF'], );
my $file = $mw->getOpenFile(-filetypes => \@pdf_type);
print "Gewaehlte Datei: $file";


$mw ist das MainWindow-Objekt und die filetypes kannst Du auch weglassen, wenn es da keine Beschränkungen geben soll.

Diesen Code musst Du in den Callback für den Menüeintrag Datei -> Öffnen einbauen.

Für "Speichern":



my @pdf_type = (['PDF files', '.pdf',],['PDF files', '.PDF'], );
my $output = $mw->getSaveFile(-filetypes => \@pdf_type);
open my $fh, '>', $output or die $!;
print $fh 'Inhalt';
close $fh;

TB09
03-07-2009, 12:37
Hallo und danke für deine Hilfe.

Leider funktioniert es nicht. Ich erhalte folgende Fehlermeldung:

Tk::Error: Can't call method "GetOpenFile" on an undefined value at C:\Dokumente
und Einstellungen\Thomas\Desktop\gui.pl line 52.
(menu invoke)


Wer weiß Rat?

Molaf
03-07-2009, 14:29
Hallo,

offenbar rufst Du die Methode auf, auf einer unbenutzen Variable.

Wenn $mw nicht dein Main-Window ist, dann ersetze in den beiden Beispielen $mw durch die Variable in der das Main-Window-Objekt landet.

Deinen Skript sollte von der Reihenfolge her irgendwie so aussehen:
use strict;
use Tk;

my $widget = MainWindow->new;
...
...
...
$widget->getOpenFile();

TB09
03-07-2009, 14:58
Hallo, Danke, du hast recht,

aber dennoch funbktioniert es nicht. Ich habe jetzt eine Fehlermeldung,
dass GetOptFile.pm nicht in @INC zu finden ist.

Ich habe aber TK::FileDialog bereits mittels ActiveState perl package manager installiert. Ich finde aber das Modul auch nicht.

In welchem Package man denn die nötigen Module?

reneeb
04-07-2009, 20:35
"GetOptFile"?? das müsste GetOpenFile heißen. Kannst Du mal ein kleines Testprogramm posten, mit dem es nicht funktioniert?

Welche Perl-Version verwendest Du?

Dann kann ich Dir vielleicht mehr zu dem Fehler sagen.

TB09
05-07-2009, 15:05
Ja, natürlich GetOpenFile;

Hier Code, der nicht funktioniert:

#!/usr/local/bin/perl
use Tk;
require tk::GetOpenFile;
# Main Window
my $mw = new MainWindow;
my $label = $mw -> Label(-text=>"Hello World") -> pack();
my $button = $mw -> Button(-text => "Quit",
-command => [\&FileOpen])
-> pack();
MainLoop;
my $file;
sub FileOpen {
$mw->GetOpenFile()
}

UND HIER DIE FEHLERMELDUNG;
#!/usr/local/bin/perl
use Tk;
require tk::GetOpenFile;
# Main Window
my $mw = new MainWindow;
my $label = $mw -> Label(-text=>"Hello World") -> pack();
my $button = $mw -> Button(-text => "Quit",
-command => [\&FileOpen])
-> pack();
MainLoop;
my $file;
sub FileOpen {
$mw->GetOpenFile()
}


WENN ICH DIE ZEILE "Require.." entferne, dann kommt folgende Fehlermeldung:

Assuming 'require Tk::GetOpenFile;' at gui2.pl line 13
Tk::Error: Can't locate Tk/GetOpenFile.pm in @INC (@INC contains: E:/Programme/A
ctivePerl/site/lib E:/Programme/ActivePerl/lib .) at E:/Programme/ActivePerl/sit
e/lib/Tk/Widget.pm line 270.
Tk::Widget::_AutoloadTkWidget at E:/Programme/ActivePerl/site/lib/Tk/Widget.pm
line 268
Tk::Widget::AUTOLOAD at E:/Programme/ActivePerl/site/lib/Tk/Widget.pm line 338
main::FileOpen at gui2.pl line 13
Tk callback for .button
Tk::__ANON__ at E:/Programme/ActivePerl/site/lib/Tk.pm line 250
Tk::Button::butUp at E:/Programme/ActivePerl/site/lib/Tk/Button.pm line 175
<ButtonRelease-1>
(command bound to event)

Molaf
06-07-2009, 04:19
Die Lösung ist hier einfach:


das require tk::GetOpenFile; kannst 'Du löschen, die Methode gehört zum Tk-Kern.
$mw->GetOpenFile in der vorletzten Zeile ändern in $mw->getOpenFile;


Wenn das Programm unter Windows läuft ist es ja mest egal aber die Shebang lautet üblicherweise:
#!/usr/bin/perl
ohne 'local', zumindest auf allen mir bekannten Maschinen.

Gruß,
Molaf