2016-12-23 2 views
0

Я очень новичок в разработке приложений GTK и Gnome, поэтому извиняюсь за свою наивность. (Мой язык разработки - Python). Я хотел бы использовать ListBox для отображения некоторых данных, и отдельные представления строк будут довольно сложными (т. Е. Состоят из нескольких разных виджетов). В результате я бы предпочел не использовать TreeView, потому что для этого потребуется куча пользовательских обработок/событий. Я заметил, что ListBox имеет метод bind_model, но кажется, что я не могу использовать его для привязки модели ListStore, даже думал, что ListStore реализует интерфейс ListModel. Кто-нибудь знает, как это сделать?PyGi: Как использовать GTKListBox с GTKListStore?

+3

Параметр 'Gtk.ListStore' для' Gtk.TreeView's. Вам нужно использовать 'Gio.ListStore' для' Gtk.ListBox.bind_model() '. – elya5

ответ

0

Это сокращенный код из моей программы учета с открытым исходным кодом.

import gi 
gi.require_version('Gtk', '3.0') 
from gi.repository import Gtk, GdkPixbuf, Gdk 
import os, sys 


class GUI : 

    def __init__(self): 

     listbox = Gtk.ListBox() 

     employee_name_label = Gtk.Label("Henry", xalign=1) 

     combo = Gtk.ComboBoxText() 
     combo.set_property("can-focus", True) 
     for name in ["bar", "foo", "python"]: 
      combo.append('0', name) 

     list_box_row = Gtk.ListBoxRow() 
     hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) 
     list_box_row.add(hbox) 

     switch = Gtk.Switch() 
     switch.props.valign = Gtk.Align.CENTER 


     project_time_label = Gtk.Label("0:00:00", xalign=1) 
     project_time_label.set_property('width-chars', 8) 


     hbox.pack_start(employee_name_label, True, False, 5) 
     hbox.pack_end(project_time_label, False, False, 5) 
     hbox.pack_end(switch, False, False, 5) 
     hbox.pack_end(combo, False, False, 5) 


     listbox.add(list_box_row) 

     window = Gtk.Window() 
     window.add(listbox) 
     window.connect("destroy", self.on_window_destroy) 
     window.show_all() 

    def on_window_destroy(self, window): 
     Gtk.main_quit() 

def main(): 
    app = GUI() 
    Gtk.main() 

if __name__ == "__main__": 
    sys.exit(main()) 

Возможно, он не может точно ответить на ваш вопрос, но он работает, и он показывает способ использования ListBox. ListBox - очень хороший выбор для сложных настроек. В моем случае я делал так много операций каждую секунду, что он разбил Treeviews.

0

Простой exampe:

import gi 
gi.require_version('Gtk', '3.0') 
from gi.repository import Gtk, Gio, GObject 
import sys 

class Item(GObject.GObject): 

    text = GObject.property(type = str) 

    def __init__(self): 
     GObject.GObject.__init__(self) 

class GUI: 

    def __init__(self):   
     item1 = Item() 
     item1.text = "Hello" 
     item2 = Item() 
     item2.text = "World" 

     liststore = Gio.ListStore() 
     liststore.append(item1) 
     liststore.append(item2) 

     listbox=Gtk.ListBox() 
     listbox.bind_model(liststore, self.create_widget_func) 

     window = Gtk.Window() 
     window.add(listbox) 
     window.connect("destroy", self.on_window_destroy) 
     window.show_all() 

    def create_widget_func(self,item): 
     label=Gtk.Label(item.text) 
     return label 

    def on_window_destroy(self, window): 
     Gtk.main_quit() 

def main(): 

    app = GUI() 
    Gtk.main() 

if __name__ == "__main__": 
    sys.exit(main()) 
+0

Пожалуйста, добавьте больше описания и/или информации о вашем ответе и о том, как он решает заданную проблему, чтобы другие могли легко понять это, не прося разъяснений – koceeng

Смежные вопросы