gpt4 book ai didi

python - Gtk+ FlowBox 选择不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 16:13:53 25 4
gpt4 key购买 nike

我目前正在开发 PyGObject 应用程序,但在选择 Gtk+ FlowBox 中的特定子项时遇到问题。即使在选择 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

奇怪的是,当我使用以下代码(放置在“self.add(flowbox)”行之前)检查选择了哪个子项时,终端显示我指定要选择的子项(在索引处) 2) 是唯一选定的子项,即使窗口仅显示第一个被选定的子项:

for child in flowbox.get_selected_children():
print child.get_index()

最佳答案

我认为您已经在 GTK 中找到了一个错误,似乎 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()

关于python - Gtk+ FlowBox 选择不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39069891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com