2016-08-22 2 views
1

현재 PyGObject 앱을 개발 중이며 Gtk + FlowBox에서 특정 하위 항목을 선택하는 데 문제가 있습니다. FlowBox를 채우고 특정 자식을 선택하는 코드를 작성하는 FlowBox 선택 모드 (SINGLE)를 선택한 후에도 첫 번째 자식이 항상 선택됩니다. Screenshot of above code runningGtk + FlowBox 선택이 작동하지 않습니다.

이상한 부분은 내가 선택하는 자녀를 확인할 때이다 : 나는 인덱스 2에서 아이를 선택하는 선택하더라도

#!/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() 

는 응용 프로그램은 오직 선택되는 첫 번째 자식을 나타낸다 "self.add (flowbox)"행 앞에 놓인 다음 코드를 사용하여, 터미널은 첫 번째 자식 만 보여 주지만 (인덱스 2에서) 선택하도록 지정된 자식이 유일하게 선택된 자식임을 표시합니다 선택됨 :

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

GTK +의 특정 버전은 무엇입니까? – andlabs

+0

우분투 16.04를 사용하고 있으므로 Gtk + 3.18입니다. –

답변

1

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() 
+0

고마워요! 내 프로그램에서 문제가 해결되었습니다. 이 버그를 Gtk 개발자에게보고 할 것입니다. –

관련 문제