Schrift
[thread]12881[/thread]

Permanenten Output in Frame ausgeben.

Leser: 3


<< >> 5 Einträge, 1 Seite
rommi
 2008-12-09 14:40
#116997 #116997
User since
2005-03-03
54 Artikel
BenutzerIn
[default_avatar]
Hallo Zusammen,

möchte gerne folgendes erstellen: Ein Haupffenster, ein Anzeige-Frame im Haupftfenster und ein Button.

Im Anzeige-Frame soll ein Output wie in einer Dos-Box (mit Scrollbalken) ausgegeben werden können. Mit dem Button soll der Output im Anzeige-Frame gestartet und angehalten werden können. D.h. wenn man auf den Button klickt soll der Output im Anzeige-Frame ausgegeben werden und wenn man auf denselben Button nochmal klickt soll der Output für eine beliebige Zeit angehalten bzw. wieder forgesetzt werden können. Sowie z.B. mit der Pause-Taste bei einem Dos-Fenster. Es soll also nur ein Button sein der Start und Pause regelt (schon aus Platzgründen!). Ich habe mal nachstehed ein ungefähres Konstrukt (nur zur groben Darstellung) erstellt.

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
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
#================================
#               Variablen
#================================
$ButtontextS    = "Start";
$ButtontextP    = "Pause";
$ButtontextW    = "Weiter";
$torkel         = 1;
$zaehler                     = 0;
$zahl           = 50;
#================================
#               Hauptfenster
#================================
$Hf = new MainWindow (-title => "Test");
$Hf->geometry('400x300');
$Hf->geometry('+10+10');
#================================
#               Anzeige-Frame (bzw. Widget)
#================================
$FrAnzeige      = $Hf->Frame(-borderwidth, 3,-relief, ridge)
->pack();
$Anzeigefenst   = $FrAnzeige->Scrolled(Text,-wrap,none, 
                                        -scrollbars,se,         
                                        -height,14, 
                                        -width,80) 
->pack();
#================================
#               Buttons
#================================
$BtnStart       = $Hf->Button(-text => "Start")
->pack(-side => 'left',-expand => "1", -fill => both);

$BtnQuit        = $Hf->Button(-text => "Abbrechen", -command => [ $Hf => 'destroy'])
->pack(-side => 'left',-expand => "1", -fill => both);
#================================
#               Bindung
#================================
$BtnStart->bind('<Button-1>', 
        sub
        {
            if($torkel eq 1)
            {
                $BtnStart->configure(-text => "$ButtontextP");
                $torkel--;
                start();
            }
            else
            {
                $BtnStart->configure(-text => "$ButtontextW");
                $torkel++;
                stop();
            }

         }
);
#================================
# Tk-Abschlussanweisung
#================================
MainLoop();
#================================
#               Unterprogramm
#================================
sub start 
{
   while ()
   {
        # hier soll irgendein Code ausgeführt werden
        # und der Output soll dann im Anzeigeframe
        # erscheinen
        # z.B.

        $zahl = $zahl + $zaehler++;
        print "\nZahl: $zahl"; 
        sleep 1;
   }
}

sub stop 
{
        # Hier soll der Output zeitweise angehalten
        # werden können
}


Also dass sind dabei meine Probleme:
1) Der Output vom Unterprogramm soll im Anzeigeframe, analog wie bei einem Dos-Fenster, ausgegeben werden. Ich denke ne Listbox ist da nicht so geeignet. Gibts da schon irgendein Widget dass für solche Sachen am besten
geeignet ist? Canvas ist auch nicht so optimal für so ne Sache.

2) Es wird permanent neuer Output erzeugt und der soll auch immer gleich im Anzeigeframe ausgegeben werden. Dabei soll aber das Haupfenster nicht blockiert werden. Ich denke das ich da wohl mit eval arbeiten muss, oder? Weil sonst läuft zwar die Sub los aber gibt das Haupffenster nicht frei!!

3) Und dann soll durch Klicken auf den Button der Output zeitweise angehal-ten werden können und natürlich wieder fortgesetzt werden können.. hmmmm?

Ich komm im Moment nicht weiter. Wer kann mir ein bisschen auf die Sprünge helfen. Danke im voraus fürs Helfen :-) ! Gruss rommi
FoolAck
 2008-12-09 14:59
#116998 #116998
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Naja, kannst ja einfach das Listbox Widget der Sub übergeben und dann immer statt "print" einfach "$listbox->insert('end', $output)" oder so machen.

Zum Blockieren des Hauptfensters: vielleicht einfach regelmäßig update() aufs MainWindow aufrufen? (Am Besten irgendwo in der while-Schleife.)

Und kA, den Zustand Start-Stop könntest du ja in einer globalen Datenstruktur festhalten. Diesen Zustand müsste man dann am Besten per Button togglen können.
Code (perl): (dl )
while ($data->{running}) {}


kA ob ich hier Schnapstips gebe oder am Thema vorbeirede, man möge auf weiter Antworten warten.
rommi
 2008-12-09 16:11
#116999 #116999
User since
2005-03-03
54 Artikel
BenutzerIn
[default_avatar]
Hallo FoolAck,

danke für die schnelle Antwort. Habe es parallel auch hingekriegt. Allerdings gibt es keine Garantie dafür dass ich hier nicht nochmal was wissen möchte
:-))
Gruss, rommi
Spieler
 2008-12-09 19:57
#117009 #117009
User since
2007-09-24
70 Artikel
BenutzerIn
[default_avatar]
Hallo,

Tk::Text hat übrigens ein Tied Interface (ist dokumentiert) damit geht z.B. *STDOUT in ein Textwidget

Grüße, Christoph
rommi
 2008-12-10 03:48
#117023 #117023
User since
2005-03-03
54 Artikel
BenutzerIn
[default_avatar]
Hallo Christoph,

danke für den Tip!!

Gruss, rommi
<< >> 5 Einträge, 1 Seite



View all threads created 2008-12-09 14:40.