Gtk treeview刷新导致滚动条返回到页面顶部

时间:2018-04-06 19:26:08

标签: python python-2.7 treeview gtk scrolledwindow

我正在编写一个类似于任务管理器的程序(类似于windows所具有的),我在GUI中使用gtk + 3中的树视图。问题是,通过使树视图更新“实时”,滚动条停止正常运行。每次刷新树视图时,滚动条都会显示在页面顶部。 这是用于更新树视图的行:

#define SQLITE_HAS_CODEC
#include "sqlite3.h"
#include <string>
#include <iostream>

using namespace std;

int main()
{
    sqlite3* db;
    sqlite3_open("test1.db", &db);

    sqlite3_key(
        db, /* Database to be rekeyed */
        "test", sizeof("test") /* The key, and the length of the key in bytes */
    );

    std::string createQuery =
        "CREATE TABLE IF NOT EXISTS items (userid INTEGER PRIMARY KEY, ipaddr       TEXT, username TEXT, useradd TEXT, userphone INTEGER, age INTEGER, "
        "time TEXT NOT NULL DEFAULT (NOW()));";

    sqlite3_stmt* createStmt;
    std::cout << "Creating Table Statement" << endl;
    sqlite3_prepare(db, createQuery.c_str(), createQuery.size(), &createStmt, NULL);
    cout << "Stepping Table Statement" << endl;
    if (sqlite3_step(createStmt) != SQLITE_DONE) cout << "Didn't Create Table!" << endl;

    string insertQuery =
        "INSERT INTO items (time, ipaddr,username,useradd,userphone,age) VALUES('7:30', '192.187.27.55', 'vivekanand', 'kolkatta', '04456823948', 74);";
    // WORKS!
    sqlite3_stmt* insertStmt;
    cout << "Creating Insert Statement" << endl;
    sqlite3_prepare(db, insertQuery.c_str(), insertQuery.size(), &insertStmt, NULL);
    cout << "Stepping Insert Statement" << endl;
    if (sqlite3_step(insertStmt) != SQLITE_DONE) cout << "Didn't Insert Item!" << endl;

    return 0;
}

这是函数update_treeview:

sqlite3_key(
            db, /* Database to be rekeyed */
            "test", sizeof("test") /* The key, and the length of the key in bytes */
        );

如果重要的话,这就是我创建树视图的方式:

        GObject.timeout_add_seconds(1, self.update_treeview)

树视图位于滚动的窗口对象中:

def update_treeview(self):
    self.process_list_store.clear()
    p_list = create_list(self.properties, create_list_of_processes())
    for p in p_list:
        self.process_list_store.append(list(p))
    return True

我寻找其他更新树视图的方法,但我无法找到解决方案。我很感激有任何帮助来解决这个问题,谢谢!

编辑: 这是完整的代码:

def create_treeview(process_list_store):
    treeview = gtk.TreeView(process_list_store)
    for i, col_title in enumerate(['Name', 'pid', 'Username', 'Memory usage', 'Cpu usage']):
        renderer = gtk.CellRendererText()
        column = gtk.TreeViewColumn(col_title, renderer, text=i)
        column.set_sort_column_id(i)
        column.set_min_width(110)
        column.set_resizable(i)
        treeview.append_column(column)
    return treeview

1 个答案:

答案 0 :(得分:0)

此更新适用于我:

{{1}}

以下是docs

不幸的是,这会导致窗口闪烁。最终的方法是逐行更新树视图。但这是非常难以编写的代码。

相关问题