Thread Gtk2 - TreeView mit automatischen Refresh (2 answers)
Opened by Cyron at 2013-06-20 11:55

Cyron
 2013-06-20 11:55
#168502 #168502
User since
2013-06-20
2 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich verwende Perl jetzt schon länger, hauptsächlich für verschiedene Skripte für meine Linux-Server. Mit grafischer Oberfläche musste ich mich bei Perl noch nie auseinander setzen. Jetzt ist es aber doch mal soweit gekommen. Hier zu meinem Problem:

Ich brauche in meiner Oberfläche eine TreeView mit 2 Ebenen (Parent, Child). Diese sollen sich nach einer bestimmten Zeit (so um die 5 Minuten) automatisch aktualisieren. Und hieran scheitere ich momentan. Ich schaffe es, dass es sich bei einem Klick auf einen Button aktualisiert, wenn ich es aber mit Glib::Timeout versuche alle paar Sekunden hin zu bekommen klappt das nicht. Es ist der gleiche Code aber aus irgendeinem Grund wird er nur einmal ausgeführt. Ich sehe also eine Aktualisierung und habe danach keine automatische Aktualisierung mehr.

Ich habe jetzt schon etliche Sachen und Kombinationen versucht. Unter anderen die verschiedenen Widgets aus ihrem Window/Box per remove zu entfernen, per Glib::Timeout den gesamten GUI-Erzeugenden Teil in eine Schleife zu packen etc....

Wäre um Hilfe echt dankbar, da ich jetzt schon viele Stunden an dem Problem hocke. Im Anhang mein "Versuchscode". Betriebssystem ist das aktuelle Debian Stable(Squeeze).

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
#!/usr/bin/perl
use strict;
use warnings;
use Glib qw/TRUE FALSE/;
use Gtk2 '-init';
use utf8;


###Erzeugt eine tree_view 
sub make_tree()
{
        my $tree_store = Gtk2::TreeStore->new("Glib::String");

        ###Erzeuge mehrere Einträge mit drei Parents und jeweils 5 Childs
        foreach (1..3)
        {
                my $parent = $tree_store->append(undef);
                $tree_store->set($parent, 0, $_);
                foreach (1..5)
                {
                        my $child = $tree_store->append($parent);
                        my $zahl = int(rand(100));
                        $tree_store->set($child, 0, "CHILD: $zahl");
                }
        }
        
        my $tree_view = Gtk2::TreeView->new($tree_store);
        my $tree_column = Gtk2::TreeViewColumn->new();
        $tree_column->set_title("Value");
        $tree_column->set_sort_column_id(0);
        my $renderer = Gtk2::CellRendererText->new();
        $tree_column->pack_start($renderer, FALSE);
        $tree_column->add_attribute($renderer, text => 0);
        $tree_view->append_column($tree_column);
        
        return $tree_view;
}

###Initiales erzeugen der Ansicht
my $window = Gtk2::Window->new('toplevel');
my $vbox = Gtk2::VBox->new();
my $button = Gtk2::Button->new("Refresh");
my $tree_view = make_tree();

$vbox->pack_start($tree_view, FALSE, FALSE, 0);
$vbox->pack_start($button, FALSE, FALSE, 0);

$window->add($vbox);
$window->show_all();


###Erzeuge einen Button zum Refreshen
$button->signal_connect(clicked => sub{
        Gtk2->main_iteration while Gtk2->events_pending;
        $vbox->remove($tree_view);
        $tree_view = make_tree();
        $vbox->pack_start($tree_view, FALSE, FALSE, 0);
        $vbox->show_all();
});

###Erzeuge einen Timer der autoamtisch refreshes macht (sofern es funktioniert ca. 5min rythmus)
my $timer = Glib::Timeout->add(3000, sub{
        Gtk2->main_iteration while Gtk2->events_pending;
        $vbox->remove($tree_view);
        $tree_view = make_tree();
        $vbox->pack_start($tree_view, FALSE, FALSE, 0);
        $vbox->show_all();
});


Gtk2->main();

Last edited: 2013-06-20 12:10:52 +0200 (CEST)

View full thread Gtk2 - TreeView mit automatischen Refresh