Schrift
[thread]4636[/thread]

Primitives Telefonbuch: Perl TK

Leser: 2


<< |< 1 2 >| >> 19 Einträge, 2 Seiten
Ronnie
 2003-09-02 15:21
#42267 #42267
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Ich habe auf Crian's Website (super!) ein Beispiel für ein Listing gesehen. Das ganze sieht beinahe so aus wie die Telefonbuchappl. die ich schon immer mal machen wollte. Also habe ich das Bsp. ein wenig angepasst und es läuft super.

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
use Tk;
use Tk::HList;
use DBI;

my ($dbh, $sth);
$dbh = DBI->connect ("DBI:mysql:host=192.168.0.6;database=cdmcrm",
"ich", "geheim", {PrintError => 0, RaiseError => 1});
$sth = $dbh->prepare ("SELECT Nachname, Vorname, Telefon, Email FROM mitarbeiter WHERE Nachname LIKE 'H%'");
$sth->execute();

# Ende der Datenbankinitialisierung

$top = new MainWindow;

$hlist = $top->Scrolled("HList",
-header => 1,
-columns => 4,
-scrollbars => 'osoe',
-width => 70,
-selectbackground => 'SeaGreen3',
)->pack(-expand => 1, -fill => 'both');

$hlist->header('create', 0, -text => 'Nachname');
$hlist->header('create', 1, -text => 'Vorname');
$hlist->header('create', 2, -text => 'Telefon');
$hlist->header('create', 3, -text => 'Email');

&dbget();

MainLoop;

sub dbget {
my @zeile;
my $i=0;
while (@zeile = $sth->fetchrow_array()) {
$hlist->add($i);
$hlist->itemCreate($i, 0, -text => "$zeile[0]");
$hlist->itemCreate($i, 1, -text => "$zeile[1]");
$hlist->itemCreate($i, 2, -text => "$zeile[2]");
$hlist->itemCreate($i, 3, -text => "$zeile[3]");
$i++;
}

$sth->finish();
$dbh->disconnect()
}


Wie bekomme ich da jetzt noch ein schmuckes Suchfeld darüber? Sorry, ist vieleicht trivial, habe aber von TK keine Ahnung.

Gruss,
Ronnie
Robby
 2003-09-02 15:31
#42268 #42268
User since
2003-08-11
409 Artikel
BenutzerIn
[default_avatar]
machst ein Entry drüber:

Code: (dl )
my $such_entry = $top->Entry()->pack(); 	


und holst dann mit

Code: (dl )
my $such_eingabe = $such_entry->get;


den Wert raus und baust ihn in Dein Select ein..
ich hoffe Du weisst was ich meine :) ansonsten nochmal nachfragen wenn es irgendwo hängt...
Kaum macht man es richtig - schon funktioniert es!
Crian
 2003-09-02 15:35
#42269 #42269
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Wie stellst Du Dir die Suche denn vor?

Du könntest Dir ja zum Anfang einfach ein Eingabe-Widget und einen Button ("Suche") unter Deine HList dazufügen (ev. in einem gemeinsamen Frame untergebracht), so dass dann in der HList die Zeile angezeigt wird, die dem Namen entspricht. Oder Du erlaubst gleich eine Suche mit regulären Ausdrücken, schließlich unterstützt Perl das ja.

Wenn das klappt, kannst Du ja eine komplexere Suche basteln, wo Du auch nach Vornamen oder Telefonnummern suchen kannst.

Oder möchtest Du auf Datenbankebene suchen? Also nur Datensätze mit bestimmten Kriterien in der HList anzeigen? Wie man dann auf SQL-Ebene sucht, ist Dir ja wahrscheinlich klar.
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
Ronnie
 2003-09-02 15:44
#42270 #42270
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Quote
Oder möchtest Du auf Datenbankebene suchen? Also nur Datensätze mit bestimmten Kriterien in der HList anzeigen? Wie man dann auf SQL-Ebene sucht, ist Dir ja wahrscheinlich klar.

Ja, die SQL-Seite ist kein Problem. Ich will nur nach dem Namen suchen: '$suchstring%'. Ich stelle es mir als 'Textbox' zu Eingabe und 'Button' vor. Das ganze oberhalb der HList.

Gruss,
Ronnie
Robby
 2003-09-02 15:55
#42271 #42271
User since
2003-08-11
409 Artikel
BenutzerIn
[default_avatar]
dann machst Du es am besten wie oben beschrieben...
Du machst ein Entry. Bindest da die Return taste dran und wenn jemand return drückt, dann holst Du Dir den Wert da raus, machst ein % dahinter und baust es in Deinem Select ein....
Das sollte es doch schon gewesen sein oder fehlt noch was?
Kaum macht man es richtig - schon funktioniert es!
Ronnie
 2003-09-02 16:02
#42272 #42272
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Hmm, wenn ich das mache habe ich zwar ein Eingabefeld, welches aber zur Laufzeit leer ist, so dass mir alle Datensätze geholt werden. Auf eine Eingabe zur Laufzeit reagiert es gar nicht?!
Crian
 2003-09-02 16:07
#42273 #42273
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Oder wie ich beschrieben hab mit dem Button daneben. An den kannst Du (dann) die Return-Taste binden.

Also in der Art:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
my $f = $top->Frame()->pack(-expand => 1);
my $e = $f->Entry(-width => 50,)->pack(side => 'left', -expand => 1, -fill => 'x');
my $such_b = $f->Button(-text => 'Suchen', -default => 'active', -command => \&suchen,)->pack(-side => 'left');

$top->bind ('<Return>',    sub{$such_b-> invoke()});

sub suchen {
my $such = $e->get();
   ...
}

(uingetestet)\n\n

<!--EDIT|Crian|1062504521-->
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
 2003-09-02 16:11
#42274 #42274
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
[quote=Ronnie,02.09.2003, 14:02]Hmm, wenn ich das mache habe ich zwar ein Eingabefeld, welches aber zur Laufzeit leer ist, so dass mir alle Datensätze geholt werden. Auf eine Eingabe zur Laufzeit reagiert es gar nicht?![/quote]
Die Logik musst Du dann in meinem Beispiel in die suchen-Funktion legen. Am besten leerst Du da die HList und baust sie neu auf, den Suchbedingungen genügend.

Dafür schreibst Du Dir am besten eine extra Funktion, die die HList füllt und den Suchparameter mitbekommt, die kannst Du dann auch beim Start des Programms mit leerem Suchstring aufrufen. So vermeidest Du doppelten Code.\n\n

<!--EDIT|Crian|1062504690-->
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
Ronnie
 2003-09-02 16:21
#42275 #42275
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Wie verhindere ich das er jedes mal 'ne neue HList erzeugt? z.Z. sieht mein Skript so aus:

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
use Tk;
use Tk::HList;
use DBI;

# Ende der Datenbankinitialisierung

$top = new MainWindow;

my $f = $top->Frame()->pack(-expand => 1);
my $e = $f->Entry(-width => 50,)->pack(side => 'left', -expand => 1, -fill => 'x');
my $such_b = $f->Button(-text => 'Suchen', -default => 'active', -command => \&suchen,)->pack(-side => 'left');

$top->bind ('<Return>', sub{$such_b-> invoke()});

MainLoop;

sub suchen {
my $such = $e->get();
my ($dbh, $sth);
$dbh = DBI->connect ("DBI:mysql:host=192.168.42.6;database=cdmcrm",
"www-data", "www-data", {PrintError => 0, RaiseError => 1});
$sth = $dbh->prepare (" SELECT Nachname, Vorname, Telefon, Email FROM mitarbeiter
WHERE Nachname LIKE '$such%'");
$sth->execute();
$hlist = $top->Scrolled("HList",
-header => 1,
-columns => 4,
-scrollbars => 'osoe',
-width => 70,
-selectbackground => 'SeaGreen3',
)->pack(-expand => 1, -fill => 'both');

$hlist->header('create', 0, -text => 'Nachname');
$hlist->header('create', 1, -text => 'Vorname');
$hlist->header('create', 2, -text => 'Telefon');
$hlist->header('create', 3, -text => 'Email');

my @zeile;
my $i=0;
while (@zeile = $sth->fetchrow_array()) {
$hlist->add($i);
$hlist->itemCreate($i, 0, -text => "$zeile[0]");
$hlist->itemCreate($i, 1, -text => "$zeile[1]");
$hlist->itemCreate($i, 2, -text => "$zeile[2]");
$hlist->itemCreate($i, 3, -text => "$zeile[3]");
$i++;
}

$sth->finish();
$dbh->disconnect()

}


Gruss,
Ronnie
Robby
 2003-09-02 17:28
#42276 #42276
User since
2003-08-11
409 Artikel
BenutzerIn
[default_avatar]
Edit: Böser, böser Browser....doppelpost gelöscht :)\n\n

<!--EDIT|Robby|1062570110-->
Kaum macht man es richtig - schon funktioniert es!
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2003-09-02 15:21.