[英]Parent error when Inserting new page in Gtk.Notebook containing a TreeView widget
我做了一個類,每當用筆記本作為參數調用它時,都會插入一個新標簽。 我想做的是將一個適當的容器與此新選項卡關聯。 我認為以此小部件作為參數調用我的類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
因為我被困在這里兩天了,我將不勝感激任何幫助或建議!
我發現的解決方案是使用選項卡名稱(str)和負責實參的類調用類CreateTab來創建內容。
例如,從main.py開始創建一個名為“ Supplier's list”的新選項卡:
CreateTab(title='Suppliers's list', Content=Suppliers)
從類CreateTab中,我創建一個VBox()
container = VBox()
然后使用新創建的VBox作為參數啟動Content。
Content(container)
因此,在內容(可以是我想要的任何形式的供應商,客戶,發票...)中,我創建所有小部件並將它們附加在網格中。 這是簡化的Suppliers類:
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()
我希望這會對某人有所幫助。
我想知道我是否可以對從glade文件導入的窗口執行相同的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.