如何在pygtk中使标签可关闭?

5 投票
3 回答
2896 浏览
提问于 2025-04-17 10:10

我正在用Python和GTK做一个简单的文本编辑器,里面有标签页。因为我还是新手,所以我想知道怎么才能让这些标签页可以关闭和重新排序?在QT里这要简单得多,但我更喜欢GTK。这是我的代码:

import gtk
from tab import *

 class Dash(gtk.Notebook):
    def __init__(self):
        super(gtk.Notebook,self).__init__()
        self.defaultTab()

    def defaultTab(self):
        tab = Tab()
        self.append_page(tab.child,tab.label)

另外一个模块“tab”里有一些变量:

from launchers import *

class Tab():
    def __init__(self):
        self.label = gtk.Label("New Tab")
        self.type = "dash"
        launchers = Launchers()
        self.child = launchers

那我该怎么做呢?

3 个回答

0

这里有一个简单的例子,展示了如何创建一个带有标签页的笔记本,并且设置一个关闭时的处理函数:

import gi
gi.require_version('Gtk', '3.0')

from gi.repository import Gtk as gtk

class Tab():
    def __init__(self, title, parent):
        self.title = title
        self.parent = parent
        self.header = gtk.HBox()
        self.title = gtk.Label(label=title)
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_CLOSE, gtk.IconSize.MENU)
        close_button = gtk.Button()
        close_button.set_image(image)
        close_button.set_relief(gtk.ReliefStyle.NONE)
        close_button.connect("clicked", self.on_tab_close)

        self.header.pack_start(self.title,
                          expand=True, fill=True, padding=0)
        self.header.pack_end(close_button,
                        expand=False, fill=False, padding=0)
        self.header.show_all()

    def on_tab_close(self, button):
        self.parent.remove_page(self.parent.get_current_page())

class Dash(gtk.Notebook):

    def new_tab(self, title):
        tab = Tab(title, self)
        self.sw = gtk.ScrolledWindow()
        self.page = self.sw
        self.page.add(gtk.Label(label=title))
        self.append_page(self.page, tab.header)


d = Dash()
d.new_tab("first")
d.new_tab("second")
d.new_tab("third")
window = gtk.Window(gtk.WindowType.TOPLEVEL)
window.set_default_size(400, 400);
window.connect("destroy", gtk.main_quit)
window.add(d)
window.show_all()

gtk.main()

output

5

为了让标签页可以重新排序,在你调用 append_page() 之后,执行以下操作:

self.child_set_property(tab.child, 'reorderable', True)

或者:

self.set_tab_reorderable(tab.child, True)

这里有一个简单的例子:

import gtk

win = gtk.Window(gtk.WINDOW_TOPLEVEL)
notebook = gtk.Notebook()
page1 = gtk.Label('This is the first page')
page2 = gtk.Label('This is the second page')

notebook.append_page(page1, gtk.Label('P1'))
notebook.append_page(page2, gtk.Label('P2'))
notebook.props.border_width = 12
notebook.set_tab_reorderable(page1, True)
notebook.set_tab_reorderable(page2, True)
win.add(notebook)

win.connect('delete-event', gtk.main_quit)
win.show_all()
gtk.main()
11

在往 gtk.Notebook 添加新页面时,不要直接使用 gtk.Label。你需要创建一个 gtk.HBox,这个盒子里要放一个 gtk.Label 和一个 gtk.Button。大概就是这样的:

class Dash(gtk.Notebook):
...
    def defaultTab(self):
        self.append_page(tab.child,tab.header)
...
class Tab():
    def __init__(self):
        ...
        header = gtk.HBox()
        title_label = gtk.Label()
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_MENU)
        close_button = gtk.Button()
        close_button.set_image(image)
        close_button.set_relief(gtk.RELIEF_NONE)
        self.connect(close_button, 'clicked', self.close_cb)

        header.pack_start(title_label,
                          expand=True, fill=True, padding=0)
        header.pack_end(close_button,
                        expand=False, fill=False, padding=0)
        header.show_all()
        self.header = header
        ...

这样做只是为了显示关闭按钮。要真正关闭标签页,你还需要处理按钮的 clicked 信号。

撰写回答