uk ru en pl cs sk bg de fr es it ro hu tr ar id zh

Python 1.Tixライブラリウィジェットの動的GUI実装機能:ScrolledWindowとNoteBook

メインに シンボルについて

動的プログラミング言語Pythonの利点の1つは、実行時にグラフィカルユーザーインターフェイス(GUI)を動的に作成できることです。 組み込みライブラリTkinterを使用すると、制御、入力、および出力情報用のさまざまなグラフィック要素、ウィジェットを作成、配置、移動できます。 しかし、Tkinterライブラリには1つの機能があります。ウィジェットの数が、モニタ画面で使用可能な最大サイズのウィンドウを表示できるようになった場合、ウィンドウの隠れた領域にアクセスするという問題があります。

組み込みライブラリTkinterの拡張であるTix(Tk Interface Extension)ライブラリは、ScrolledWindowウィジェット(スクロールバーを持つウィンドウ)の助けを借りてこの問題を解決できます。 Tixライブラリに付属している2番目の便利なウィジェットは、タブ付きのウィンドウであるNoteBookです。

しかし、これらのウィジェットをPythonのウィンドウアプリケーションで使用すると、内部ウィジェットが割り当てられたウィンドウサイズに収まらない場合に情報を表示するという独自の特徴があります。 この記事では、動的GUIを整理する際にこれらの機能を見ていきます。
最初の例は、ScrolledWindowウィジェットをメインのアプリケーションウィンドウに配置することで、他のすべてのウィジェットは自動的に配置されます。
2番目の例は、ScrollledWindowウィジェットをノートブックウィジェットのタブにだけ配置することです。

ここに示す例は、Python 2.7とLinuxオペレーティングシステム:Ubuntu 16.04LTSで実装されています。 あなたのPythonのバージョンとオペレーティングシステムでこれらのサンプルを実装しても、複雑さはありません。


例1 - アプリケーション全体のメインコンテナとしてのScrolledWindowウィジェット。

#!/usr/bin/python

import Tix as tx

root=tx.Tk()
root.geometry("800x600+0+10")

swr=tx.ScrolledWindow(root)
swr.pack(fill=tx.BOTH, expand=1)

nb=tx.NoteBook(swr.window)
nb.pack(fill=tx.BOTH, expand=1)

for i in range(1,21):
	nb.add("tab"+str(i),label="Tab "+str(i))

for k in range(1,39):
	l=tx.Label(nb.tab1,text="label "+str(k))
	l.pack()

for k in range(1,29):
	l=tx.Label(nb.tab2,text="label "+str(k))
	l.pack(side=tx.LEFT)

root.mainloop()

シナリオNo.1の結果は、次の3つの図に示されています。


図1

起動後のアプリケーションNo.1の初期ビュー。 メインウインドウの右下からスクロールバーが自動的に表示されます。 最初のサイクルで指定されたタブの数と次の2つのサイクルで指定されたラベルの数のため、NoteBookウィジェットが占める合計サイズが元のルートウィンドウ(800x600)よりも大きいためです。 この図は、指定された20個のタブのうち、15個だけがメインウィンドウに配置され、最初のタブで指定された39個のラベルのうち31個だけが配置されていることを示しています。


図2

初期状態の2番目のタブには、28個のうち16個のラベルしか表示されません。 スクロールバーの位置は変更されません。


図3

一番下のスクロールバーを右に動かすと、メインウィンドウにNoteBookウィジェットのすべてのタブだけでなく、2番目のタブに配置されているすべてのタグが表示されます。


例2 - ScrolledWindowウィジェットはNoteBookウィジェットの各タブの内側にあります。

#!/usr/bin/python

import Tix as tx

root=tx.Tk()
root.geometry("800x600+0+10")

swm = []

nb=tx.NoteBook(root)
nb.pack(fill=tx.BOTH, expand=1)

for i in range(1,21):
	nb.add("tab"+str(i),label="Tab "+str(i))
	sw=tx.ScrolledWindow(eval("nb.tab"+str(i)))
	swm.append(sw)
	sw.pack(fill=tx.BOTH, expand=1)

for k in range(1,39):
	l=tx.Label(swm[0].window,text="label "+str(k))
	l.pack()

for k in range(1,29):
	l=tx.Label(swm[1].window,text="label "+str(k))
	l.pack(side=tx.LEFT)

root.mainloop()

シナリオ2の結果は、次の3つの図に示されています。


図4

起動後のアプリケーションNo.2の最初のビュー。 スクロールバーは、垂直マークの数がメインウィンドウの元のサイズよりも大きいため、Tab1タブの右側にのみ表示されます。


図5

2番目のタブには下のスクロールバーのみが表示されます。このタブではラベルが水平に配置されているためです。


図6

スクロールバーを右に動かすと、ウィンドウの最後にすべてのラベルが表示されますが、15より大きい数字のタブにはアクセスできません。 したがって、変形例2では、スクロールバーはタブ内でのみアクセスを提供する。 タブの数がメインウィンドウの水平サイズに配置されている数よりも多い場合、そのタブにアクセスすることはできません。

したがって、NoteBookウィジェットのタブ数が大きすぎてメインウィンドウの表示制限を超えることができない場合、ScrolledWindowウィジェットの位置の考慮された変形はかなり受け入れられます。

ScrolledWindowのウィジェットウィンドウが配置されているオブジェクトによって占められている最大サイズに展開されるため、両方のバリアントを統一しようとすると、例1と同じ結果になります。

これらの例がPythonでウィンドウアプリケーションを設計するのに役立つことを願っています。

Oleksii Tolkachov (ORCID ID: 0000-0002-4835-0507), Kiev, 30.08.2017.

メインに シンボルについて