Gtk FlowBox - 框可点击区域中的按钮很小

Gtk FlowBox - buttons in box clickable area tiny

我创建了一个 GtkFlowBox,我在其中添加了很多按钮,并试图使用一个功能来捕捉对这些按钮的点击,目前,该功能仅输出所选按钮。但是,每个按钮的实际可点击区域很小——您需要点击按钮的右角才能注册。

我似乎无法在 GtkFlowBox class 和 GtkButton class 中找到任何选项来扩展子项的可点击区域。下面是一个演示的最小工作示例。

class NotebookWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="FlowBox Test")

        #Create Application Window
        self.set_border_width(10)
        self.set_default_size(800, 600)
        self.set_position(Gtk.WindowPosition.CENTER)

        #Add external container (box)
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        self.add(vbox)

        #Add tabbed window
        self.nbook = Gtk.Notebook()
        vbox.pack_start(self.nbook, True, True, 0)
        self.nbook.show()

        #Add Clubs tab
        frame = Gtk.Frame()
        frame.show()

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)

        club_box = Gtk.FlowBox()
        club_box.set_valign(Gtk.Align.START)
        club_box.set_max_children_per_line(30)
        club_box.set_selection_mode(Gtk.SelectionMode.SINGLE)
        club_box.set_activate_on_single_click(True)

        for club in range(0, 55):
            button = Gtk.Button(club)
            club_box.add(button)

        vbox.pack_start(club_box, True, True, 0)

        self.out_message = Gtk.Label("\n")
        vbox.add(self.out_message)

        label = Gtk.Label()
        label.set_markup("<b><big>Clubs</big></b>")

        frame.add(vbox)

        club_box.connect("child-activated", self.on_club_details)

        self.nbook.append_page(frame, label)


    def on_club_details(self, club_box, child):
        print "clicked club box %d" % child.get_index()


win = NotebookWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()


Gtk.main()

我认为您真正想要的是注册对按钮的点击,而不是当它们被激活时。按钮不一定在点击后立即激活。

我稍微简化了您的代码,但这是我认为您想要实现的目标:

class NotebookWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="FlowBox Test")

        #Create Application Window
        self.set_border_width(10)
        self.set_default_size(400, 400)
        self.set_position(Gtk.WindowPosition.CENTER)

        #Add tabbed window
        self.nbook = Gtk.Notebook()
        self.add(self.nbook)

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)

        club_box = Gtk.FlowBox()
        club_box.set_valign(Gtk.Align.START)
        club_box.set_max_children_per_line(30)
        club_box.set_selection_mode(Gtk.SelectionMode.SINGLE)
        club_box.set_activate_on_single_click(True)

        self.buttons = []
        for club in range(0, 55):
            button = Gtk.Button(label=club)
            club_box.add(button)
            button.connect('clicked', self.on_button_clicked)  # new callback
            self.buttons.append(button)

        vbox.pack_start(club_box, True, True, 0)

        self.out_message = Gtk.Label(label="\n")
        vbox.pack_start(self.out_message, True, True, 0)

        label = Gtk.Label()
        label.set_markup("<b><big>Clubs</big></b>")
        self.nbook.append_page(vbox, label)


    def on_button_clicked(self, button):
        for i in range(len(self.buttons)):
            if self.buttons[i] == button:
                print('button at index {}'.format(i))
                break


win = NotebookWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()


Gtk.main()