Gtk+ FlowBox 选择不起作用
Gtk+ FlowBox selection not working
我目前正在开发 PyGObject 应用程序,但在 Gtk+ FlowBox 中 selecting 特定 children 遇到问题。即使在 selecting FlowBox selection 模式(SINGLE)填充 FlowBox 并将代码写入 select 特定 child 之后,第一个 child 始终是 selected.
#!/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()
即使我选择 select 索引 2 处的 child,该应用程序只会显示第一个 child 被 selected:
Screenshot of above code running
奇怪的是,当我使用以下代码(位于 "self.add(flowbox)" 行之前)检查哪个 child 被 select 编辑时,终端显示 child 我指定要 selected(在索引 2)是唯一的 selected child,即使 window 只显示第一个 child 正在 select编辑:
for child in flowbox.get_selected_children():
print child.get_index()
我认为您在 GTK 中找到了一个错误,似乎 show_all
中的某些东西出了问题。我的第一个猜测是它是由 FlowBox
没有实现的事实引起的,所以我更改了你的代码以使用 show
信号(realize
但 show
被发射稍后)并检查它是否仍然发生。可悲的是..
所以我觉得还有其他问题所以只是在 Gtk.Window.__init__
之后添加了一个快速测试 self.show()
这使选择有效但使 Flowbox
比需要的更宽(可能是因为空 window) 的默认宽度。所以我在监听器中添加了 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()
我目前正在开发 PyGObject 应用程序,但在 Gtk+ FlowBox 中 selecting 特定 children 遇到问题。即使在 selecting FlowBox selection 模式(SINGLE)填充 FlowBox 并将代码写入 select 特定 child 之后,第一个 child 始终是 selected.
#!/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()
即使我选择 select 索引 2 处的 child,该应用程序只会显示第一个 child 被 selected: Screenshot of above code running
奇怪的是,当我使用以下代码(位于 "self.add(flowbox)" 行之前)检查哪个 child 被 select 编辑时,终端显示 child 我指定要 selected(在索引 2)是唯一的 selected child,即使 window 只显示第一个 child 正在 select编辑:
for child in flowbox.get_selected_children():
print child.get_index()
我认为您在 GTK 中找到了一个错误,似乎 show_all
中的某些东西出了问题。我的第一个猜测是它是由 FlowBox
没有实现的事实引起的,所以我更改了你的代码以使用 show
信号(realize
但 show
被发射稍后)并检查它是否仍然发生。可悲的是..
所以我觉得还有其他问题所以只是在 Gtk.Window.__init__
之后添加了一个快速测试 self.show()
这使选择有效但使 Flowbox
比需要的更宽(可能是因为空 window) 的默认宽度。所以我在监听器中添加了 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()