1

PythonとpyGTKを使用したプロジェクトに取り組んでいます。画像を表示することだけを目的としたウィンドウがあります。画像が大きすぎて画面に収まらない場合を除いて、ウィンドウにはデフォルトでスクロールバーが表示されないはずです。
だから私がすることはこのようなものです:

window = gtk.Window()
window.resize(image.size[0], image.size[1])

scrolled = gtk.ScrolledWindow()
scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
scrolled.set_shadow_type(gtk.SHADOW_NONE)

area = gtk.DrawingArea()
area.set_size_request(image.size[0], image.size[1])

window.add(scrolled)
scrolled.add_with_viewport(area)
area.show()
scrolled.show()
window.show()

しかし、それは完全には機能しません。結果のウィンドウは少し小さすぎるため、スクロールバーが表示されます。
それが機能するために、私はこれに2行目を感謝する必要があります:

window.resize(image.size[0] + 2, image.size[1] + 2)

しかし、それは醜いものであり、すべてのシステムで機能するわけではありません。私のWindowsボックスでは、+3を使用する必要があります。

ウィンドウが画像に対して十分な大きさであることを確認するにはどうすればよいですか?

4

1 に答える 1

5

私はそれを考え出した :)。

ScrolledWindow内にDrawingAreaを配置すると、正常に機能しなくなります。代わりに、DrawingAreaをビューポートに配置し、ビューポートをScrolledWindowに配置する必要があります。gtk.ScrolledWindowは、便宜上、これを自動的に行うメソッドgtk.ScrolledWindow.add_with_viewportを提供します。問題は、そのメソッドによって生成されたビューポートにはデフォルトで境界線があり、その境界線の幅はシステムによって異なることです。また、生成されたビューポートにアクセスする方法(私が知っている)はありません(編集: scrolled.get_child()を使用して境界線を取り除くことができます)。解決策は簡単です。ビューポートを手動で作成する必要があります。

window = gtk.Window()
window.resize(image.size[0], image.size[1])

scrolled = gtk.ScrolledWindow()
scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
scrolled.set_shadow_type(gtk.SHADOW_NONE)

viewport = gtk.Viewport()
viewport.set_shadow_type(gtk.SHADOW_NONE)  // Get rid of the border.

area = gtk.DrawingArea()
area.set_size_request(image.size[0], image.size[1])

window.add(scrolled)
scrolled.add(viewport)
viewport.add(area)
viewport.show()
area.show()
scrolled.show()
window.show()

Arch(GNOME 3)、Windows XP、Windows 7、Ubuntu(Unity)では魅力のように機能しました。

于 2011-06-13T00:31:16.787 に答える