1. 説明
Python のユーザーインターフェイス開発には QT5 と Tkinter がありますが、実際のプロジェクトではインターフェイスの高さを高くする必要があるため QT5 が使用され、開発者のデモ プログラムや簡単なプログラムには QT5 は推奨されず、Tkinter で十分です。この記事は、最も基本的な機能、つまり時間を節約してより多くのメリットを実現するための Tkinter 演習です。
2 番目に、最も基本的なウィンドウの実現
2.1 パッケージのインポート
パッケージのインポート
from tkinter import *
from tkinter import ttk
2.2 メインウィンドウ、隠しウィンドウ
Tkinter ウィンドウは、メイン ウィンドウのルートと Frame ウィンドウの 2 つの側面で構成されており、Frame は入れ子にすることができます。
プログラムでは、明示的なフレーム ウィンドウ、メイン ウィンドウ、およびウィジェット間の関係は次のとおりです。
- プログラムにはトータル ウィンドウ エンティティ (ROOT) が必要です
- プログラムにフレーム ウィンドウを含めることをお勧めします。 Frame
- 窓枠は目に見えないモデルです。
- フレームは入れ子にして繰り返し使用できます。
- ウィジェットはルートにインストールできますが、制限があるため推奨されません。
2.3 実験 1: メイン ウィンドウの ROOT と Frame を表示する
from tkinter import *
root = Tk() # create root window
root.title("Frame Example")
root.config(bg="skyblue")
# Create Frame widget
left_frame = Frame(root, width=200, height=400)
left_frame.grid(row=0, column=0, padx=10, pady=5)
root.mainloop()
結果は次のとおりです。
見られます:
left_frame = フレーム(ルート、幅=200、高さ=400)
------- このステートメントは、ウィンドウの中央の白い領域である長いフレームを生成します。
left_frame.grid(行=0、列=0、padx=10、pady=5)
------- このステートメントは、(10, 5) から (210, 405) までの領域内のウィンドウの位置に Frame を設定します。
2.3 ルートとフレームを明示的に生成する
通常、ROOTウィンドウとフレームは連続して生成されます。
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
root.geometry("300x300")
root.config(bg="skyblue")
root.mainloop()
このうち、root.geometry("300x300") は ROOT サイズを指しますが、Frame とは関係ありません。フレームはサイズが決まっていないので見えません。
2.4 非表示のルート生成ウィンドウ
次のプログラムはデフォルトで ROOT を生成し、Frame.master を使用して ROOT を表します。
frm = ttk.Frame(None)
frm.master.title('Sample application')
frm.master.geometry("300x300")
frm.mainloop()
2.5 ウィジェットを追加する
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
root.geometry("300x300")
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
2.6 パッケージ化されたウィンドウ
#!/usr/bin/env python 1
import Tkinter as tk 2
class Application(tk.Frame): 3
def __init__(self, master=None):
tk.Frame.__init__(self, master) 4
self.grid() 5
self.createWidgets()
def createWidgets(self):
self.quitButton = tk.Button(self, text='Quit',
command=self.quit) 6
self.quitButton.grid() 7
app = Application() 8
app.master.title('Sample application') 9
app.master.geometry("300x300") 10
app.mainloop()
3. ウィジェットについて
3.1 フルウィンドウの実装
以下の図に示すように、最初にウィンドウを設計し、フレームとウィジェットのレイアウトを設計します。
3.2 窓の実現
声明 | 意味 |
---|---|
マスター = Tk() | # Tkinter メインウィンドウを生成する |
l1 = ラベル(マスター、テキスト="高さ") l2 = ラベル(マスター、テキスト="幅") |
テキストラベルオブジェクトを生成します。ルートがメインウィンドウになります。 |
l1.grid(行=0、列=0、スティッキー=W、パディ=2) l2.grid(行=1、列=0、スティッキー=W、パディ=2) |
# グリッドメソッドはラベルを別々に配置します # 指定された行と列、 #sticky はセル内のコントロールの配置です。以下を参照してください。 |
e1 = エントリー(マスター) |
# ユーザーからエントリを取得するためのエントリ ウィジェット |
e1.grid(行=0、列=1、水田=2) e2.grid(行=1、列=1、水田=2) |
# これによりエントリウィジェットが配置されます |
e1 = エントリー(マスター) e2 = エントリー(マスター) |
# ユーザーからエントリを取得するためのエントリ ウィジェット |
img = PhotoImage(file= "賞品.png") |
# 画像を追加します (画像は JPG ではなく PNG である必要があることに注意してください) |
Label(マスター、イメージ=img1).grid(行=0、列=2、 列スパン=2、行スパン=2、パッドx=5、パディ=5) |
# ラベルを作成して画像を貼り付ける |
3.3 スティッキーについて
セルに小さなコントロールを配置するにはどうすればよいですか? スティッキー=tk.??、どこ?? 以下の図で指定されているとおりです
- Sticky 属性を指定しない場合、デフォルトの動作ではウィジェットがセルの中央に配置されます。
- Sticky=tk.NE (右上)、tk.SE (右下)、tk.SW (左下)、または tk.NW (左上) を使用して、ウィジェットをセルの隅に配置できます。
- Sticky=tk.N (中央上)、tk.E (中央右)、tk.S (中央下)、または tk.W (中央左) を使用して、ウィジェットをセルの側面の中央に配置できます。
- Sticky=tk.N+tk.S を使用してウィジェットを垂直方向に引き伸ばしますが、水平方向は中央に配置します。
- Sticky=tk.E+tk.W を使用して水平方向に引き伸ばしますが、垂直方向は中央に配置します。
- Sticky=tk.N+tk.E+tk.S+tk.W を使用して、ウィジェットを水平方向と垂直方向に引き伸ばしてセルを埋めます。
- 他の組み合わせも機能します。たとえば、sticky=tk.N+tk.S+tk.W はウィジェットを垂直方向に伸ばして西 (左) の壁に配置します。
3.4 すべてのコードは次のとおりです
from tkinter import *
from tkinter.ttk import *
# creating main tkinter window/toplevel
master = Tk()
# this will create a label widget
l1 = Label(master, text="Height")
l2 = Label(master, text="Width")
# grid method to arrange labels in respective
# rows and columns as specified
l1.grid(row=0, column=0, sticky=W, pady=2)
l2.grid(row=1, column=0, sticky=W, pady=2)
# entry widgets, used to take entry from user
e1 = Entry(master)
e2 = Entry(master)
# this will arrange entry widgets
e1.grid(row=0, column=1, pady=2)
e2.grid(row=1, column=1, pady=2)
# checkbutton widget
c1 = Checkbutton(master, text="Preserve")
c1.grid(row=2, column=0, sticky=W, columnspan=2)
# adding image (remember image should be PNG and not JPG)
img = PhotoImage(file= "prize.png")
img1 = img.subsample(2, 2)
# setting image with the help of label
Label(master, image=img1).grid(row=0, column=2,
columnspan=2, rowspan=2, padx=5, pady=5)
# button widget
b1 = Button(master, text="Zoom in")
b2 = Button(master, text="Zoom out")
# arranging button widgets
b1.grid(row=2, column=2, sticky=E)
b2.grid(row=2, column=3, sticky=E)
# infinite loop which can be terminated
# by keyboard or mouse interrupt
mainloop()
結果グラフ: