Просмотры списков Python GTK с использованием Glade

В настоящее время я разрабатываю приложение для своего рабочего стола Linux, которое считывает данные с моих спортивных часов Garmin Forerunner, анализирует не очень хорошо сформированный XML-файл и записывает данные в таблицу базы данных MySQL. У меня нет большого опыта работы с Python или GTK, поэтому графические элементы я обрабатывал с помощью конструктора графического интерфейса Glade. Вот в чем проблема. Есть некоторые данные, которые не поступают с часов, и я хотел бы добавить их перед записью в базу данных. Я читаю и/или вычисляю номер круга, расстояние круга, темп круга и продолжительность круга. Тем не менее, я хотел бы иметь возможность просматривать каждый круг в интерфейсе и классифицировать круг как Speedwork, Easy Run и т. Д., Используя поле со списком. Из того, что я читал, список - это путь.

Однако все примеры и документация, которые я видел до сих пор, строят Listview из кода (в отличие от его создания с помощью Glade). Я хотел бы пройтись по своим спискам (круг [тип: int], продолжительность [тип: строка], расстояние [тип: поплавок] и темп [тип: строка] --- обратите внимание, я храню время в виде строк, чтобы записать их к полям времени/даты в моей базе данных) и заполните поля в списке (что, как я предполагаю, является правильным способом сделать это --- поправьте меня, если я ошибаюсь) вместе с полем со списком для категоризации. Затем я брал каждую строку из списка и записывал ее в БД.

Кто-нибудь знает какие-либо примеры, которые могли бы помочь, или у кого-нибудь есть какие-то конкретные мысли?

Обновлять:

Я в основном хочу знать, как, если я размещу список или дерево в графическом интерфейсе через Glade, как я упакую его со следующими столбцами: LapID (int), Distance (float), Duration (String) и поле со списком, где я мог выбрать тип круга. Это первая часть битвы.

Как только я заполню список, как мне обратиться к каждой строке, чтобы записать ее в таблицу БД?


person Jeremy    schedule 07.02.2011    source источник
comment
Я не уверен, что понимаю ваш вопрос. Вы спрашиваете, как перебирать ListStore и добавлять данные во время выполнения в Glade?   -  person ptomato    schedule 08.02.2011


Ответы (2)


проверьте, подойдет ли вам приведенный ниже пример. Он загружает пользовательский интерфейс из файла Glade и использует базу данных sqlite для хранения элементов.

сценарий:

import gtk
import sqlite3

class  ListViewTestApp:
    def __init__(self):
        builder = gtk.Builder()
        builder.add_from_file('listview_test.glade')
        builder.connect_signals(self)

        self.model = builder.get_object('list_items')
        self.list = builder.get_object('items_view')

        column = gtk.TreeViewColumn('column0', gtk.CellRendererText(), text=0)   
        column.set_clickable(True)   
        column.set_resizable(True)   
        self.list.append_column(column)

        column = gtk.TreeViewColumn('column1', gtk.CellRendererText(), text=0)   
        column.set_clickable(True)   
        column.set_resizable(True)   
        self.list.append_column(column)

        self.create_database()
        self.load_list_items()

        window = builder.get_object('main_window')
        window.show_all()

    def create_database(self):
        self.engine = sqlite3.connect(':memory:')
        self.engine.execute('create table test_table ' + \
            '(id INTEGER NOT NULL PRIMARY KEY, test_field0 VARCHAR(30), test_field1 VARCHAR(30))');
        self.add_new_line('test0', 'test000');
        self.add_new_line('test1', 'test111');

    def load_list_items(self):
        self.model.clear()        
        result = self.engine.execute('select * from test_table');
        for row in result: 
            self.model.append([row[1], row[2]])

    def add_new_line(self, test0, test1):
        query = 'INSERT INTO test_table (test_field0, test_field1) VALUES ("{0}", "{1}")'\
            .format(test0, test1)
        self.engine.execute(query)

    def on_load_button_clicked(self, widget):
        self.load_list_items()

    def on_add_line_button_clicked(self, widget):
        id = len(self.model)
        self.add_new_line('new_item{0}'.format(id), 'new__item{0}'.format(id));
        self.load_list_items()

if __name__ == "__main__":
    ListViewTestApp()
    gtk.main()

файл поляны (listview_test.glade):

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <requires lib="gtk+" version="2.16"/>
  <!-- interface-naming-policy project-wide -->
  <object class="GtkListStore" id="list_items">
    <columns>
      <!-- column-name column0 -->
      <column type="gchararray"/>
      <!-- column-name column1 -->
      <column type="gchararray"/>
    </columns>
  </object>
  <object class="GtkWindow" id="main_window">
    <child>
      <object class="GtkFixed" id="fixed1">
        <property name="visible">True</property>
        <child>
          <object class="GtkTreeView" id="items_view">
            <property name="width_request">270</property>
            <property name="height_request">250</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="model">list_items</property>
          </object>
          <packing>
            <property name="x">200</property>
            <property name="y">20</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="load_button">
            <property name="label" translatable="yes">load</property>
            <property name="width_request">100</property>
            <property name="height_request">40</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <signal name="clicked" handler="on_load_button_clicked"/>
          </object>
          <packing>
            <property name="x">54</property>
            <property name="y">49</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="add_line_button">
            <property name="label" translatable="yes">add line</property>
            <property name="width_request">100</property>
            <property name="height_request">40</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <property name="xalign">0.41999998688697815</property>
            <property name="yalign">0.46000000834465027</property>
            <signal name="clicked" handler="on_add_line_button_clicked"/>
          </object>
          <packing>
            <property name="x">54</property>
            <property name="y">113</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

надеюсь, это поможет, с уважением

person serge_gubenko    schedule 13.02.2011
comment
Ваш код помещает одно и то же значение в оба столбца. Как мне это решить? - person Soliman; 28.04.2011

Для тех, кто заметил, что «column0» и «column1» одинаковы, просто измените text=0 на text=1, как показано ниже:

column = gtk.TreeViewColumn('column1', gtk.CellRendererText(), text=1)

http://www.pygtk.org/docs/pygtk/class-gtktreeviewcolumn.html#constructor-gtktreeviewcolumn

person James Nelson    schedule 04.05.2011