Schrift
[thread]4701[/thread]

Perl/tk, bind bei Textwidgets, html in widgets



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Frühstücker
 2004-01-15 11:21
#46709 #46709
User since
2003-10-31
9 Artikel
BenutzerIn
[default_avatar]
Guten Morgen, verehrte Perly-Community,

in Folge einer Oberflächenprgrammierung, die dazu dienen soll Dateien etc in anderen Applikationenzu öffnen, habe ich folgendes Problem:

In einem Widget sind mit HTML o.ä (siehe Frage 2)
Dateien aufgelistet.

Nun möchte ich eine Kurzbeschreibung der Datei in einem anderen Widget angeben,
wenn der Mauszeiger über der jeweilige Datei steht.

Dies ist bei Buttons mit bind kein Problem.
Jedoch habe ich ein Problem,
da ich nur ein Textwidget verwenden möchte und keine Buttons, da es sich um sehr viele Dateien handelt.

FRAGE 2:
Ich hatte bisher im Kopf, dass ich, da ich das Programm von einer CD aufrufen möchte um die darauf gespeicherten Dateien zugänglich zu machen,
HTML im Text widget benutze um die Dateien aufzurufen
(ich habe darüber in meinem Perl Buch gelesen, dass soetwas möglich ist).
So ganz koscher kommt mir das allerdings nicht vor und mich würde interessieren, ob es irgendwie anders zu machen wäre,
oder ob ihr das uneingeschrönkt empfehlen würdet.

Für jeglichen Code bin ich sehr dankbar.
MfG,
Frühstücker\n\n

<!--EDIT|havi|1074158996-->
Crian
 2004-01-15 12:50
#46710 #46710
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Warum möchtest Du die Dateien mit HTML auflisten? Reicht es nicht, die Dateinamen in eine ListBox oder HList einzutragen?

Wenn Du Dir darüber im klaren bist: Man kann darauf reagieren, über welchem Listeneintrag die Maus steht und entsprechende Callbacks hinterlegen, die dann in einem anderen Widget die passenden Informationen anzeigen.

Code gibts erst, wenn etwas klarer ist, ob Du das überhaupt gebrauchen kannst :)


Edit: Ach ja, und herzlich willkommen, ich seh gerade, das war Dein erster Beitrag hier :)\n\n

<!--EDIT|Crian|1074163842-->
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
Frühstücker
 2004-01-15 20:31
#46711 #46711
User since
2003-10-31
9 Artikel
BenutzerIn
[default_avatar]
Hallo, Crian,
danke für deine Antwort und dein Willkommen :).
Es ist zwar mein erstes Posting hier, doch bin ich schon länger schleichender Gast, nachdem ich aus "einem anderen Perlforum" ;) abgewandert bin.
Ich hab viel von dir gelesen und spreche gerne für deine Beiträge ein Lob aus.

Das ist der Anfang
Code: (dl )
1
2
3
4
5
6
7
8
9
use Tk; 
use strict;
use warnings;

my $mw = MainWindow->new();
$mw -> title ("Cd-Oberfläche");
#$mw ->geometry ('+200+500');

MainLoop();

sieht eigentlich aus, wie jedes andere Perlprogramm.
Ich habe noch ein Bild gemacht,
damit man sehen kann, wie ich mir es vorstelle.
Die Dateien sollen, wie gesagt, aus der Oberfläche heraus mit Programmen wie Acrobat Reader etc gestartet werden können.

http://free.pages.at/misanthrop/neu.jpg

Ich hoffe, es ist erklärlich genug.
Grüße,
Frühstücker.
Nochmal der Link zum Bild separat bei Serverproblemen
Crian
 2004-01-16 13:10
#46712 #46712
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=Frühstücker,15.01.2004, 19:31]Hallo, Crian,
danke für deine Antwort und dein Willkommen :).
[/quote]
Bitte, gern geschehen :)

[quote=Frühstücker,15.01.2004, 19:31]Es ist zwar mein erstes Posting hier, doch bin ich schon länger schleichender Gast, nachdem ich aus "einem anderen Perlforum" ;) abgewandert bin.
[/quote]
Gute Entscheidung ;) :D
[quote=Frühstücker,15.01.2004, 19:31]Ich hab viel von dir gelesen und spreche gerne für deine Beiträge ein Lob aus.
[/quote]
Oh danke *freu*

[quote=Frühstücker,15.01.2004, 19:31][gute Beschreibung]
Ich hoffe, es ist erklärlich genug.
[/quote]

Ja danke :)

Ich glaube, das lässt sich mit einer normalen Listbox lösen. Ich habe zwar bisher immer nur auf Mausklicks auf Listen einträge reagiert (das brauchst Du auch zur Anzeige im externen Viewer), aber noch nicht auf "Maus ist über Zeile" (was Du für die näheren Informationen unten brauchst). Ich schau mal, wie/ob das geht und suche ein paar andere dafür brauchbare Schnippsel aus meinen Programmen...
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
Frühstücker
 2004-01-16 15:00
#46713 #46713
User since
2003-10-31
9 Artikel
BenutzerIn
[default_avatar]
Mh, da bin ich mal ganz gespannt und freue mich auf deine Antwort und hoffe, in Zukunft etwas zum Boardleben beitragen zu können :).
Crian
 2004-01-16 15:12
#46714 #46714
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ich hab schon eine Idee und werde mal etwas basteln ... ist das Array mit den Dateinamen fest?

Ich gehe mal davon aus...

...wenns nicht gefällt, können wir es ja abändern...
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
Frühstücker
 2004-01-16 15:30
#46715 #46715
User since
2003-10-31
9 Artikel
BenutzerIn
[default_avatar]
Ja, das wäre fest, ich hoffe mal, dass daran denkst, dass für jede Datei eine andere Info erscheinen soll, wenn machbar :)


Offtopic:
Ich hab gerade gesehen du bist auch Linux und vorallem TOLKIEN Fan ... scheinbar eine qualitativ hochwertige Mischung :).\n\n

<!--EDIT|Frühstücker|1074259971-->
Crian
 2004-01-16 16:28
#46716 #46716
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Schau mal, ob dies ungefähr das macht, was Dir vorschwebt:

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
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
#!/usr/bin/perl

#------------------------------------------------------------------------------
# Pragmas und Module:
#------------------------------------------------------------------------------
use strict;
use warnings;

use Tk;

#------------------------------------------------------------------------------
# Globales Kofigurationshash:
#------------------------------------------------------------------------------
my %Config = ( debug => 1, # Debuginformationen?
version => '0.0.1', # Programmversion
version_datum => '16.01.2004', # Programmdatum

main_window => undef, # Hauptfenster-Widget
ausg_widget => undef, # Ausgabe-Widget
Menu => undef, # Menu-Widget
Menuefont => '{Arial} 8 {normal}', # Schriftart des Menu

Titel => 'Frühstückers CD Oberfläche',
# Fenstertitel
);

#------------------------------------------------------------------------------
# CDdaten (ein AoH):
#------------------------------------------------------------------------------
my @CD = (
{
name => 'Name der ersten CD',
interp => 'Interpret der ersten CD',
ersch => 'Erscheinungsjahr der ersten CD',
anz => 'Anzahl CD\'s',
},
{
name => 'Name der zweiten CD',
interp => 'Interpret der zweiten CD',
ersch => 'Erscheinungsjahr der zweiten CD',
anz => 'Anzahl CD\'s',
},
{
name => 'Name der dritten CD',
interp => 'Interpret der dritten CD',
ersch => 'Erscheinungsjahr der dritten CD',
anz => 'Anzahl CD\'s',
},
{
name => 'Name der vierten CD',
interp => 'Interpret der vierten CD',
ersch => 'Erscheinungsjahr der vierten CD',
anz => 'Anzahl CD\'s',
},
{
name => 'Name der fünften CD',
interp => 'Interpret der fünften CD',
ersch => 'Erscheinungsjahr der fünften CD',
anz => 'Anzahl CD\'s',
},
);

#------------------------------------------------------------------------------
# Prototypen:
#------------------------------------------------------------------------------
sub tk_main ();
sub show_data ($);
sub show_data ($);
sub clear_data ();
sub anzeigen ($);

#------------------------------------------------------------------------------
# Programmablauf:
#------------------------------------------------------------------------------
tk_main();

MainLoop();
exit;


sub tk_main () {
print "tk_main()\n" if $Config{debug};

#--------------------------------------------------------------------------
# Hauptfenster erzeugen und Fenstertitel vergeben:
#--------------------------------------------------------------------------
my $mw = new MainWindow;
$Config{main_window} = $mw;

$mw->title($Config{Titel});

#--------------------------------------------------------------------------
# Menü erzeugen:
#--------------------------------------------------------------------------

# 1. Menu-Bar erstellen:
$Config{Menu} = $mw->Menu(-type => 'menubar',
-font => $Config{Menuefont},
);

# 2. Dem Fensterwidget sagen, dass unsere Menubar sein Menu ist:
$mw->configure(-menu => $Config{Menu});

# 3. Einträge in der Menu-Bar:
$Config{Menu}->cascade(-label => 'Datei',
-underline => 0,
-font => $Config{Menuefont},
);
$Config{Menu}->separator(); # dadurch wird der Rest rechtsbündig
$Config{Menu}->cascade(-label => 'Hilfe',
-underline => 0,
-font => $Config{Menuefont},
);

# 4. Die einzelnen Untermenüs definieren:
# Zunächst das Dateimenü:
my $menu_datei = $Config{Menu}
->Menu(-font => $Config{Menuefont}, # Schriftart des Menüs
-tearoff => 0, # Menü nicht abreißbar
-menuitems => [
[
'command' => 'Speichern',
#-command => \&save,
-command => sub { print "\a" },
-accelerator => 'F2',
-font => $Config{Menuefont},
-underline => 0,
],
[
'command' => 'Speichern unter',
#-command => \&saveas,
-command => sub { print "\a" },
-accelerator => 'F12',
-font => $Config{Menuefont},
-underline => 10,
],
'-',
[
'command' => 'Beenden',
-command => sub { $mw->destroy() },
-font => $Config{Menuefont},
-underline => 0,
-accelerator => 'Esc',
],
],
);
# Dazu gehört auch, der Menubar zu sagen, dass dieses Untermenü zu seinem
# Eintrag "Datei" gehört:
$Config{Menu}->entryconfigure('Datei', -menu => $menu_datei);

# Analog für die anderen Menüs:

# Hilfemenü:
my $menu_hilfe = $Config{Menu}
->Menu(-font => $Config{Menuefont},
-tearoff => 0,
-menuitems => [
[
'command' => "Hilfe",
#-command => \&hilfe,
-command => sub { print "\a" },
-accelerator => 'F1',
-font => $Config{Menuefont},
-underline => 0,
],
'-',
[
'command' => "Über ...",
#-command => \&ueber,
-command => sub { print "\a" },
-font => $Config{Menuefont},
-underline => 0,
],
],
);
$Config{Menu}->entryconfigure('Hilfe', -menu => $menu_hilfe);


#--------------------------------------------------------------------------
# Hauptfeld:
#--------------------------------------------------------------------------
my $txt = $mw->Scrolled("Text",
-scrollbars => 'osoe',
#-background => $bcolor,
#-foreground => $tcolor,
-width => 80,
-height => 15,
-relief => 'flat',
-wrap => 'none',
)
->pack(-side => 'top',
-expand => 1,
-fill => 'both',
);

for my $index (0..$#CD) {
my $btn = $mw->Button(-text => $CD[$index]->{name},
-width => 80,
-relief => 'flat',
-anchor => 'w',
-command => [ \&anzeigen, $index ],
);

$btn->bind('<Enter>' => sub { show_data($index) } );
$btn->bind('<Leave>' => sub { clear_data } );

$txt->windowCreate('end', -window => $btn);
$txt->insert('end', "\n");
}

$txt->configure(-state => 'disabled');

#--------------------------------------------------------------------------
# Ausgabefeld:
#--------------------------------------------------------------------------
my $aus = $mw->Scrolled("Text",
-scrollbars => 'osoe',
-width => 80,
-height => 4,
-relief => 'flat',
-wrap => 'none',
-background => '#FFFFEE',
-foreground => '#FF6600',
-state => 'disabled',
-relief => 'groove',
)
->pack(-side => 'top',
-expand => 1,
-fill => 'both',
);
$Config{ausg_widget} = $aus;

#--------------------------------------------------------------------------
# Bindungen:
#--------------------------------------------------------------------------
$mw->bind('<Escape>', sub { $mw->destroy() } ); # Ctrl-B: Beenden
#$mw->bind('<F1>', \&help ); # F1: Hilfe
#$mw->bind('<F2>', \&save ); # F2: Speichern
#$mw->bind('<F12>', \&saveas ); # F12: Speichern unter

} # sub tk_main;


sub show_data ($) {
print "show_data()\n" if $Config{debug};
my $index = shift;

die "Fehlender Parameter in 'show_data'" unless defined $index;
die "Falscher Parameter '$index' in 'show_data'" unless $index >= 0 and
$index <= $#CD;

my $text = "Name : " . $CD[$index]->{name} . "\n" .
"Interpret : " . $CD[$index]->{interp} . "\n" .
"Erschienen: " . $CD[$index]->{ersch} . "\n" .
"Anzahl CDs: " . $CD[$index]->{anz};

$Config{ausg_widget}->configure(-state => 'normal');
$Config{ausg_widget}->delete('1.0', 'end');
$Config{ausg_widget}->insert('end', $text);
#$Config{ausg_widget}->insert('end', "\n");
$Config{ausg_widget}->configure(-state => 'disabled');

} # sub show_data


sub clear_data () {
print "clear_data()\n" if $Config{debug};
$Config{ausg_widget}->configure(-state => 'normal');
$Config{ausg_widget}->delete('1.0', 'end');
$Config{ausg_widget}->configure(-state => 'disabled');
} # sub clear_data


sub anzeigen ($) {
print "anzeigen()\n" if $Config{debug};
my $index = shift;

die "Fehlender Parameter in 'anzeigen'" unless defined $index;
die "Falscher Parameter '$index' in 'anzeigen'" unless $index >= 0 and
$index <= $#CD;

# ... irgendwas externes mit der CD anstellen
print "ANZEIGEN: ", $CD[$index]->{name}, "\n";

} # sub anzeigen


Da das Code-Tag hier leider Whitespace frisst, sieht der Code nicht so gut aus, ich kann ihn Dir aber sonst auch schicken, wenn es das sein sollte, was Du möchtest.\n\n

<!--EDIT|Crian|1074263766-->
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
Crian
 2004-01-16 16:34
#46717 #46717
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=Frühstücker,16.01.2004, 14:30]Ich hab gerade gesehen du bist auch Linux und vorallem TOLKIEN Fan ... scheinbar eine qualitativ hochwertige Mischung :).[/quote]
:D

ja ;)

Edit: Zu Deinem Benutzernamen: Hast Du "Herr Lehmann" von Sven Regener gelesen? ;)\n\n

<!--EDIT|Crian|1074264258-->
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
Frühstücker
 2004-01-16 17:58
#46718 #46718
User since
2003-10-31
9 Artikel
BenutzerIn
[default_avatar]
Nein, wohl leider nicht, so wie es klingt hätte ich es tun sollen. ;)

Vielen, vielen Dank für deinen Code, er ist wahrhaftig einer der besten Tk Codes ever seen und ich schreibe eigentlich schon recht lange Perl, d.h. die Syntax ist gut!

Du hast mich zwar in der verwendung missverstanden, doch haben unsere beiden Gehirne eigentlich dann doch etwas sehr produktives geschaffen.
Danke, ich glaube ich werde das weiter entwickeln und an einige Leute verteilen, die auflegen :).

Ich wollte viel mehr dieses Programm auf eine CD legen und die auf ihr enthaltenen Dateien durch den Text darunter dokumentieren. :)

Ich hoffe, es macht dir nichts aus, mir nochmal zu helfen,
auch, wenn du den kleinsten Teil noch ändern musst.
Aber du hast ner gute Idee den Anstoß gegeben :D.

Um nochmal zu verdeutlichen:
Es lieben pdf und word dateien auf der CD, die dann angezeigt werden und von dortaus auch aufgerufen werden sollen; wenn möglich mit dem Standardprogramm für dieses Format :).
Sieht verdächtig unportabel aus ... mache ich aber dann danach :).
Zielsystem ist WinXP, da offiziell das System meiner Benutzer so ist, wenn möglich aber so unabhängig wie möglich, da ich Windows GAR nicht mag. :(

P.S.: Ich nehme den Code gerne formatiert :)
P.P.S.: Hast du "Der Blingfisch" von Knippfel gelesen?\n\n

<!--EDIT|Frühstücker|1074268812-->
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2004-01-15 11:21.