0

我做了一个类,每当使用笔记本作为参数调用它时都会插入一个新选项卡。我喜欢做的是将适当的包含关联到这个新选项卡。我认为用这个小部件作为参数调用我的类 CreateTab 是个好主意。但是当我做:

>>> notebook.insert_page(treeview, hbox, 0)

我一直有这个错误:

Gtk-WARNING **: Can't set a parent on widget which has a parent

显然,我想做的是:每当我从主窗口单击一个按钮时,例如“鱼按钮”,它都会创建一个新选项卡,其中我的小部件显示“所有来自大海的鱼”。

这是我的“CreateTab”类:

class CreateTab():
def __init__(self, notebook, title):
    self.notebook = notebook
    self.pages = self.notebook.get_n_pages()
    self.create_tab(title + str(self.pages))
    self.notebook.set_current_page(self.pages)

def create_tab(self, title):
    hbox = Gtk.HBox(False, 0)
    label = Gtk.Label(title)
    hbox.pack_start(label, True, True, 0)
    pixbuf = Gtk.IconTheme.get_default().load_icon(Gtk.STOCK_CLOSE, 16,0)
    image = Gtk.Image()
    image.set_from_pixbuf(pixbuf)
    btn = Gtk.Button()
    btn.set_focus_on_click(False)
    btn.add(image)
    hbox.pack_start(btn, False, False, 0)
    hbox.show_all()
    #widget = Gtk.Label(title)
    widget = Gtk.TreeView()
    widget.show_all()
    self.notebook.insert_page(widget, hbox,self.pages)
    btn.connect('clicked', self.on_closetab_button_clicked, widget)

def on_closetab_button_clicked(self, sender, widget):
    pagenum = self.notebook.page_num(widget)
    self.notebook.remove_page(pagenum)

例如,我想关联的小部件:

类 CellRendererTextWindow(Gtk.Window):

def __init__(self):
    Gtk.Window.__init__(self, title="CellRendererText Example")

    self.set_default_size(200, 200)

    self.liststore = Gtk.ListStore(str, str)
    self.liststore.append(["Fedora", "http://fedoraproject.org/"])
    self.liststore.append(["Slackware", "http://www.slackware.com/"])
    self.liststore.append(["Sidux", "http://sidux.com/"])

    treeview = Gtk.TreeView(model=self.liststore)

    renderer_text = Gtk.CellRendererText()
    column_text = Gtk.TreeViewColumn("Text", renderer_text, text=0)
    treeview.append_column(column_text)

    renderer_editabletext = Gtk.CellRendererText()
    renderer_editabletext.set_property("editable", True)

    column_editabletext = Gtk.TreeViewColumn("Editable Text",
        renderer_editabletext, text=1)
    treeview.append_column(column_editabletext)

    renderer_editabletext.connect("edited", self.text_edited)

    self.add(treeview)

def text_edited(self, widget, path, text):
    self.liststore[path][1] = text

由于我被困在这两天,我将不胜感激任何帮助或建议!

4

1 回答 1

0

我找到的解决方案是使用选项卡名称(str)和一个负责创建内容的参数类调用我的类 CreateTab。

例如,我从 main.py 开始创建一个名为“供应商列表”的新选项卡:

CreateTab(title='Suppliers's list', Content=Suppliers)

从 CreateTab 类中,我创建了一个 VBox()

container = VBox()

我在参数中使用新创建的 VBox 启动内容。

Content(container)

所以在内容中(可以是我想要的任何东西,如供应商、客户、发票……),我创建了所有的小部件并将它们附加到一个网格中。这是一个简化的供应商类:

class Suppliers(Gtk.Window):
def __init__(self, container):
    liststore = Gtk.ListStore(int, str, str, str, str, int)
    self.data = session.load_contacts({'type_contact': 'collab'})
    for c in self.data:
        row = ([c.id, c.nom, c.prenom, c.telephone, c.mail, c.actif])
        liststore.append(row)

    # creation of a treeview
    treeview = Gtk.TreeView(model=liststore)
    ...

    # creation of a ScrolledWindow to attach the treeview
    scroll = Gtk.ScrolledWindow()
    scroll.add(treeview)

    # creation of a check button to filter the treeview
    actif_btn = Gtk.CheckButton(label="Active suppliers")
    actif_btn.connect('clicked', self.active_selected, liststore)
    actif_btn.set_active(True)

    # I create a grid to attach every thing        
    grid = Gtk.Grid()
    grid.add(actif_btn)

    # I attach every thing to the initial container
    container.pack_start(grid, False, False,  10)
    container.pack_start(scroll, True, True,  0)
    container.show_all()

我希望这会对某人有所帮助。

我想知道我是否可以对从林间空地文件导入的窗口做同样的事情。

于 2013-09-23T07:34:05.060 回答