Schrift
[thread]11227[/thread]

Automatische Aktualisierung



<< >> 10 Einträge, 1 Seite
Emigrant
 2008-01-31 23:44
#105427 #105427
User since
2008-01-31
22 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen, bin Neuling, habe mir folgende kleine subroutine geschrieben, die mir in einem kleinen Programm die Tage, Stunden und Minuten seit meiner Hochzeit anzeigt. Es gibt noch zwei Fragen dazu: Kann ich die Formatierung der Ausgabe im Format "T.TTT HH:MM" verkleinern, sieht ziemlich übel aus? Wie kann ich eine automatische Aktualisierung einbauen, d.h. wie eine Uhr aktualisieren? Diese Routine aktualisiert die Anzeige per Knopfdruck. Ich hab's mal mit Qt hingekriegt, aber Gtk2 gefällt mir besser.
Hier der Code:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sub hochtag {
    $table->remove($hochlabel);
    my $hochzeit = date "2005-12-2 11:30:00"; my $date = now; 
    my $hh=""; my $mm=""; my $TT =""; my $HH =""; 
    my $MM =""; my $TTrest =""; my $TTrest1 =""; my $TTrest2 ="";
    my $ergebnis = $date - $hochzeit; my $ergebnisTT = $ergebnis / (86400); 
    $TT = int($ergebnisTT);
    my $TTT = $TT; $TTrest = ($TTT / 1000 - int($TTT / 1000))*1000;
    $TTT = int($TTT / 1000); if ($TTT >= 1) { $TTT ="$TTT."; }
    if ($TTT == 0) { $TTT =""; } if ($TTrest < 100) { $TTrest1 ="0"; }
    if ($TTrest < 10) { $TTrest2 ="0"; }
    my $ergebnisHH = ((($ergebnis / (86400)) - int($ergebnisTT)) * 24);
    $HH = int($ergebnisHH); if ($HH<10) { $hh="0"; }
    my $ergebnisMM = (((($ergebnis / (86400)) - $TT) * 24) - $HH)*60;
    $MM = int($ergebnisMM); if ($MM<10) { $mm="0"; }
    my $hochtag = ("$TTT$TTrest1$TTrest2$TTrest $hh$HH:$mm$MM");
    my $hochlabel2 = new Gtk2::Label();
    $hochlabel->set_markup ("<span font-family=\"URW Chancery L\" color=\"#FF0000\" font_desc=\"40\">$hochtag</span>");
    $table->attach_defaults($hochlabel, 0, 1, 0, 4);
    $hochlabel->show; 
}

Für Hilfe, Anregungen und Kritik bin ich dankbar!
Emigrant
Don´t dream your life, live your dream
pktm
 2008-01-31 23:55
#105428 #105428
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Da gibts doch so ein tolles Modul zur Zeitbrechnung. Date::Calc oder so?
http://www.intergastro-service.de (mein erstes CMS :) )
topeg
 2008-02-01 00:35
#105429 #105429
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
So ließt sich das doch gleich besser, oder?
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
sub hochtag {
    $table->remove($hochlabel);
    my $hochzeit = date "2005-12-2 11:30:00"; # aus perlmodul?
    my $date = now; # == time?
    my $sekunden = $date - $hochzeit;

    my $tage = int( $sekunden/86400 );
    $sekunden -= $tage*86400;

    my $stunden = int( $sekunden/3600 );
    $sekunden -= $stunden*3600;

    my $minuten = int( $sekunden/60 );
    $sekunden -= $minuten*60;

    # Tausenderpunkte
    $tage=~s/(?<=\d)(?=(?:\d{3})+$)/./cg;

    # Ausgebe erzeugen
    my $hochtag = sprintf('%s %2u:%2u.%2u',$tage,$stunden,$minuten,$sekunden);

    $hochlabel->set_markup ("<span font-family=\"URW Chancery L\" color=\"#FF0000\" font_desc=\"40\">$hochtag</span>");
    $table->attach_defaults($hochlabel, 0, 1, 0, 4);
    $hochlabel->show;
}

# einmal pro Sekunde ausführen
Glib::Timeout->add (1000,\&hochtag);
YippyYappo
 2008-02-01 02:29
#105430 #105430
User since
2008-01-24
22 Artikel
BenutzerIn
[default_avatar]
use Date::Manip;
$date=&ParseDate("today");
$delta=&DateCalc($hochzeitsdatum,$date,\$err,1);
($dummy1, $dummy2, $weeks, $days, $hours, $minutes, $seconds) = split(/:/,$delta);

#einfache Umrechungen:
$newdays=($weeks*7)+$days;
$newhours=($newdays*24)+$hours;
#usw.
#Zeitzonen beachten!

HTH.
Emigrant
 2008-02-01 11:06
#105438 #105438
User since
2008-01-31
22 Artikel
BenutzerIn
[default_avatar]
Hallo topeg, danke für die Formatierung, viel, viel besser! Für die Zukunft was gelernt!
Code (perl): (dl )
Glib::Timeout->add (1000,\&hochtag); 
wird einmal ausgeführt, muß da noch was geladen werden? Wenn ja, was?
Code (perl): (dl )
Use of /c modifier is meaningless in s/// at hochzeit.pl line 30. 
Sekunden brauch' ich nicht.
Wie gesagt, mit Qt mal hingekriegt über 'slot' und 'attribute', aber wie in Gtk2 oder Perl?
Irgendeine Idee?
Ach so, benutze Suse 10.3 mit KDE, vielleicht hängt's da???
Don´t dream your life, live your dream
Emigrant
 2008-02-01 14:32
#105469 #105469
User since
2008-01-31
22 Artikel
BenutzerIn
[default_avatar]
An alle, wen es interessiert, des Pudels Kern:

http://www.perlmonks.org/?node_id=538341

zentara hat die Lösung geschrieben.
Don´t dream your life, live your dream
topeg
 2008-02-01 21:35
#105475 #105475
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Da ich die "glib" selten allein benutze, habe ich nicht daran gedacht, dass man auch ein Mainloop braucht.
Normalerweise nutze ich das gtk2-perl interene Loop mittels
Code (perl): (dl )
use Gtk2 '-init';


Die Warnung kommt von der Zeile:
Code (perl): (dl )
$tage=~s/(?<=\d)(?=(?:\d{3})+$)/./cg;

nimm das 'c' am Ende raus. Habe nicht aufgepasst. :-)

Für Minuten '60000' als Intervall eintragen.

Nebenbei:
Schon mehr als drei Jahre (Tage > 1000) verheiratet und zählst immer noch die Tage? Du gibst die Hoffnung nicht auf, oder?! ;-)
Emigrant
 2008-02-02 15:14
#105487 #105487
User since
2008-01-31
22 Artikel
BenutzerIn
[default_avatar]
Hi topeg, hab folgenden Code eingebaut
Code (perl): (dl )
1
2
3
4
5
6
7
8
my $loop = Glib::MainLoop->new; my $count = 1; my $timer = Glib::Timeout->add (1000, \&gibmir, undef, 1 );
sub gibmir{ $count++; &aktuell; return 1; }
my $quit = Gtk2::Button->new("Kill me softly");
   $table->attach_defaults($quit, 0, 2, 9, 10);
   $quit->signal_connect (clicked => sub { &stop; } );

$window->show_all; $table->show; $loop->run;
sub stop { $loop->quit; Gtk2->main_quit; }

und erhalte, wenn ich beende, folgende Fehlermeldung:
Code (perl): (dl )
Gtk-CRITICAL **: gtk_main_quit: assertion `main_loops != NULL' failed at einfach line 106.

Deine Variante funktioniert nicht, weil ich in &aktuell zwei weitere SUB aufrufe und dann aktualisiert er nicht mehr. Auch muß ich 2mal klicken zum Beenden, weil er erst die LOOP beendet(dann kommt die Fehlermeldung) und dann erst das Programm. Soll ich den Beenden-Knopf umbenennen? ;-))
Any idea?? Das Beenden muß außerhalb der LOOP erfolgen, sonst passiert nix, oder Strg c eingeben. Daß ich nach drei Jahren noch die Tage zähl, ist Quatsch ;-) ,war nur als Beispiel gedacht.
Don´t dream your life, live your dream
topeg
 2008-02-02 20:05
#105489 #105489
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Allso das funktioniert:

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
#!/usr/bin/perl

use strict;
use warnings;
use Gtk2 '-init';

my $cnt=0;
Glib::Timeout->add (1000, \&gibmir);

my $window= Gtk2::Window->new();

my $vbox=Gtk2::VBox->new(0,0);
$window->add($vbox);

my $quit = Gtk2::Button->new("Kill me softly");
$quit->signal_connect (clicked => sub { &stop; } );
$vbox->pack_start($quit,0,0,0);

my $count = Gtk2::Label->new(' COUNT: 0 ');
$vbox->pack_start($count,0,0,0);

$window->show_all;
Gtk2->main;

sub aktuell
{
$count->set_text(" COUNT: $cnt ");
}

sub gibmir
{
$cnt++;
&aktuell;
return 1;
}

sub stop
{
Gtk2->main_quit;
exit(0);
}


Nebenbei, ich kann dir nicht viel helfen, wenn du mir unvollständigen Beispielcode zeigst.
Da kann ich nur raten was vorher steht und was danach. der fhelr muß ja nicht an der stelle sein, die du zeigst.
Was z.B ist "$table" oder was steht in "&aktuell" wo ist das "Gtk2->main" u.s.w. u.s.f.
Emigrant
 2008-02-02 21:43
#105492 #105492
User since
2008-01-31
22 Artikel
BenutzerIn
[default_avatar]
Hab Dank
Code (perl): (dl )
1
2
3
4
5
sub stop
{
 exit(0);
 Gtk2->main_quit;
 }

läuft bei mir, 1. LOOP beenden, 2. Programm beenden, keine Fehlermeldung mehr
Danke
Don´t dream your life, live your dream
<< >> 10 Einträge, 1 Seite



View all threads created 2008-01-31 23:44.