Gtk+流箱选择不起作用

2024-09-28 23:38:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在开发一个PyGObject应用程序,在Gtk+流程框中选择特定的子对象时遇到问题。即使选择了FlowBox选择模式(SINGLE)填充FlowBox并编写代码以选择特定子级,也始终选择第一个子级。在

#!/usr/bin/python

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

class App(Gtk.Window):

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

        flowbox = Gtk.FlowBox()
        flowbox.set_valign(Gtk.Align.START)
        flowbox.set_selection_mode(Gtk.SelectionMode.SINGLE)

        # Drawing 3 squares
        flowbox.add(self.drawing_area())
        flowbox.add(self.drawing_area())
        flowbox.add(self.drawing_area())

        child = flowbox.get_child_at_index(2)
        flowbox.select_child(child)
        flowbox.queue_draw()

        self.add(flowbox)

    def drawing_area(self):
        preview = Gtk.DrawingArea()
        preview.connect("draw", self.draw_square)
        preview.set_size_request(150, 150)
        return preview

    def draw_square(self, widget, cr):
        cr.scale(150, 150)

        style_context = widget.get_style_context()
        color = style_context.get_color(Gtk.StateFlags.NORMAL)
        cr.set_source_rgba(*color)

        cr.rectangle(0, 0, 1, 1)
        cr.fill()

window = App()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()

即使我选择在索引2处选择子项,应用程序也只显示第一个被选中的子项: Screenshot of above code running

奇怪的是,当我使用下面的代码(放在自我添加(flowbox)“行”,终端显示指定要选择的子项(在索引2处)是唯一选定的子项,即使窗口只显示正在选择的第一个子项:

^{pr2}$

Tags: selfaddchildappgtkareapreviewcr
1条回答
网友
1楼 · 发布于 2024-09-28 23:38:43

我想您已经在GTK中找到了一个bug,show_all中的某个东西似乎出了问题。我的第一个猜测是由于FlowBox没有实现这一事实,所以我更改了代码,使用show信号(realize,但是show是稍后发出的),并检查它是否仍然存在。可悲的是。。在

所以我有一种感觉,其他的东西被关闭了,所以只要在Gtk.Window.__init__后面加上一个快速测试self.show()这使得选择有效,但使Flowbox比需要的更宽(可能是因为空窗口的默认宽度)。所以我在侦听器中添加了self.show(),这实际上解决了这个问题。在

这是一个完整的错误报告,但它仍然是一个完整的错误代码。在

#!/usr/bin/python

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

class App(Gtk.Window):

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

        self.flowbox = Gtk.FlowBox()
        self.flowbox.set_valign(Gtk.Align.START)
        self.flowbox.set_selection_mode(Gtk.SelectionMode.SINGLE)

        # Drawing 3 squares
        self.flowbox.add(self.drawing_area())
        self.flowbox.add(self.drawing_area())
        self.flowbox.add(self.drawing_area())

        self.flowbox.connect("show", self.on_realize)

        self.add(self.flowbox)

    def on_realize(self, flowbox):
        # The creative workaround/hack
        self.show()
        child = self.flowbox.get_child_at_index(2)
        self.flowbox.select_child(child)

    def drawing_area(self):
        preview = Gtk.DrawingArea()
        preview.connect("draw", self.draw_square)
        preview.set_size_request(150, 150)
        return preview

    def draw_square(self, widget, cr):
        cr.scale(150, 150)

        style_context = widget.get_style_context()
        color = style_context.get_color(Gtk.StateFlags.NORMAL)
        cr.set_source_rgba(*color)

        cr.rectangle(0, 0, 1, 1)
        cr.fill()

window = App()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()

相关问题 更多 >