2012-12-05 3 views
2

matplotlib 플롯 위에 단추 (및 기타 GTK 위젯)를 표시하려고합니다. 그러나 그것은 항상 FigureCanvas 아래에 표시됩니다.matplotlib의 FigureCanvas 위에 GTK-widget을 표시하는 방법

여기서 최소한의 예이다

import gtk 
import matplotlib as mpl 
from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as FigureCanvas 

win=gtk.Window() 
fixed=gtk.Fixed() 
win.add(fixed) 

fig=mpl.figure.Figure() 
canvas=FigureCanvas(fig) 
canvas.set_size_request(100,100) 
fixed.put(canvas,0,0) 
button=gtk.Button('test') 
fixed.put(button,80,80) 
button2=gtk.Button('test2') 
fixed.put(button2,0,0) 

win.show_all() 
gtk.main() 

I는 button.window.raise_()으로 GDK 창의 z 순서를 변경하려고 시도했지만, 성공하지.

문제를 해결할 방법이 있습니까?

편집 :
새로운 GDK 창을 만들지 않습니다 gtk.Button을 밝혀하지만 FigureCanvas는 새로 만들 않는 반면, 부모의 창을 다시 사용합니다.

위의 에 button2을 입력하면 버튼이 캔버스 위에 표시됩니다. 그러나, 그것은 추한 사각형 테두리가 있습니다. 어떤 생각을 어떻게 제거 할까?

+0

왜 캔버스에 버튼을 놓으시겠습니까? 그것 옆에 적당한 타협이 있습니까? – tacaswell

+0

플롯은 전체 화면을 채우기로되어 있으며 다른 위젯을 임시 오버레이로 표시하려고합니다 (예 : 파일을 여는 FileChooser). 가능하지 않다면 대안을 찾아야 할 것입니다. – zimtfrosch

+0

GTK 3와'Gtk.Overlay'를 사용하십시오. – ptomato

답변

0

나는이 문제를 맞이한 날에 만났고 좋은 해결책을 얻었습니다.

canvas.set_size_request 메소드 뒤에 다음 행을 추가하십시오.

canvas.set_has_window은 (거짓)

이유는 기본 FigureCanvas이 별도로 그려 질 수 있습니다 자신의 창을 가지고 객체이다. 그래서 그것은 gtk.Fixed와 다른 자식들의 처리 순서를 따르지 않을 것입니다. Here은 gtk의 드로잉 모델에 대한 참조입니다.

set_has_window 메소드 canvas가 지정된 gtk.Fixed 규칙을 따라야하는 순서로 부모와 동일한 창을 사용하여 캔버스를 강제 실행합니다.

관련 문제