Python Tk 3

チェックボタン

チェックボタンは、Checkbutton() メソッドで作成します。
以下のスクリプトでは、ボタンを押すと、チェックボタンの状態によってラベルの表示が変化します。

#!/usr/bin/env python
import Tkinter

def func1():
	if val.get():
		label.configure(text='checked')
	else:
		label.configure(text='unchecked')

root = Tkinter.Tk()

val = Tkinter.BooleanVar()
val.set(False)

label = Tkinter.Label(root, text='unchecked')
label.pack()
ch1 = Tkinter.Checkbutton(text = 'check1', variable = val)
ch1.pack()
b = Tkinter.Button(root, text='button', command=func1)
b.pack()

root.mainloop()

スクリプト解説

if val.get():
valの値をget()メソッドで得ます。
val は BooleanVar のインスタンスなので、返り値はTrueかFalseです。
val = Tkinter.BooleanVar()
TrueかFalseをとるオブジェクトを BooleanVar() メソッドによって得ます。
このBooleanVarは、Variable クラスのサブクラスです。 ウィジェットの variable オプションに渡すことによって、そのウィジェットと関連付けることができます。
Variable クラスは、set() と get() メソッドを持ち、これらのメソッドで値の設定・取得を行います。
val.set(False)
BooleanVar オブジェクトに False を設定します。
ch1 = Tkinter.Checkbutton(text = 'check1', variable = val)
チェックボタンを作成します。
ラベル text は'check1'、チェックが入っているかどうかを調べるオブジェクトとして、 val を設定します。
val は、最初 False に設定されているので、チェックボタンはチェックがつかない状態で表示されます。

ラジオボタン

ラジオボタンは、Radiobutton() メソッドで作成します。
以下のスクリプトでは、ボタンを押したときにチェックの入っているラジオボタンを調べて、ラベルの表示が変化させています。

#!/usr/bin/env python
import Tkinter

def func1():
	if val.get() == 0:
		label.configure(text='radio 0')
	else:
		label.configure(text='radio 1')

root = Tkinter.Tk()

val = Tkinter.IntVar()
val.set(0)

label = Tkinter.Label(root, text='radio 0')
label.pack()
r0 = Tkinter.Radiobutton(text = 'radio0', variable = val, value = 0)
r0.pack()
r1 = Tkinter.Radiobutton(text = 'radio1', variable = val, value = 1)
r1.pack()
b = Tkinter.Button(root, text='button', command=func1)
b.pack()

root.mainloop()

スクリプト解説

val = Tkinter.IntVar()
int の値を保持するオブジェクトを作成します。
IntVar は Variable クラスのサブクラスです。
val.set(0)
オブジェクトに 0 を設定します。
r0 = Tkinter.Radiobutton(text = 'radio0', variable = val, value = 0)
ラジオボタンを作成します。
表示するテキスト text は 'radio0'、値を保持するオブジェクト variable は val、 このラジオボタンの値 value は 0 です。

ダイアログ

ダイアログを作成するには、tkMessageBox モジュールのメソッドを使用します。

askokcancel()
OK, CANCEL ボタンのついたダイアログ。
OK ボタンを押すと Ture、 CANCEL ボタンを押すと False が返ります。
askquestion()
YES, NO ボタンのついたダイアログ。
YES ボタンを押すと Ture、 NO ボタンを押すと False が返ります。
askretrycancel()
RETRY, CANCEL ボタンのついたダイアログ。
RETRY ボタンを押すと Ture、 CANCEL ボタンを押すと False が返ります。
askyesno()
YES, NO ボタンのついたダイアログ。
YES ボタンを押すと Ture、 NO ボタンを押すと False が返ります。
showerror()
OK ボタンのついたダイアログ。
OK ボタンを押すと 'ok' が返ります。
showinfo()
OK ボタンのついたダイアログ。
OK ボタンを押すと 'ok' が返ります。
showwarning()
OK ボタンのついたダイアログ。
OK ボタンを押すと 'ok' が返ります。
#!/usr/bin/env python
import Tkinter
import tkMessageBox

def showDialog():
	ret = tkMessageBox.askokcancel(title = 'AskOkCancel Dialog', message = 'Press OK or CANCEL')	
	if ret:
		label.configure(text='OK pressed')
	else:
		label.configure(text='CANCEL pressed')
	
root = Tkinter.Tk()
label = Tkinter.Label(root, text='press button')
label.pack()
button = Tkinter.Button(root, text='Show', command = showDialog)
button.pack()

root.mainloop()


OK ボタンを押した結果

スクリプト解説

import tkMessageBox
ダイアログを使用するために、tkMessageBox モジュールをインポートします。
ret = tkMessageBox.askokcancel(title = 'AskOkCancel Dialog', message = 'Press OK or CANCEL')
askokcancel ダイアログを作成します。
タイトルバー(title)に 'AskOkCancel Dialog'、ウインドウ内のメッセージ(message)に 'Press OK or CANCEL'と表示します。
OK ボタンを押すと True、CANCEL ボタンを押すと False が変数 ret に代入されます。

ファイル選択

ファイルを読み込むためには tkFileDialog モジュールの askopenfilename() メソッド、 ファイル保存用には asksaveasfilename() メソッドを使用します。
以下のスクリプトでは、画像ファイルを読み込んで表示しています。

#!/usr/bin/env python
import os
import Tkinter
import tkFileDialog

path = '/home/abe'

def loadpic():
	global picdata, path
	filename = tkFileDialog.askopenfilename(filetypes = [('Image Files', ('.gif', '.ppm'))], initialdir = path)
	if filename != '':
		path = os.path.dirname(filename)
		picdata = Tkinter.PhotoImage(file = filename)
		label.configure(image = picdata)

root = Tkinter.Tk()

picdata = Tkinter.PhotoImage(width = 64, height = 64)
label = Tkinter.Label(root, image = picdata)
label.pack()
b = Tkinter.Button(root, text = 'Load', command = loadpic)
b.pack()

root.mainloop()


スクリプト解説

global picdata, path
外部変数 picdata, path を関数内部で使用します。
filename = tkFileDialog.askopenfilename(filetypes = [('Image Files', ('.gif', '.ppm'))], initialdir = path)
読み込むファイルを開くためのダイアログを表示します。
オプションの意味は、以下の様になります。
filetypes = [('Image Files', ('.gif', '.ppm'))]
開くためのファイルの種類を指定します。
[(名前1, (拡張子1, ...)), ...]
例えば、テキストファイル(.txt)と、すべての種類のファイルを指定する場合は、以下の様になります。
[('Text Files', '.txt'), ('All Files', '*')]
initialdir = path
最初に表示するディレクトリを指定します。
if filename != '':
askopenfilename() メソッドでファイルが選ばれていれば、 filename は空文字列 '' にはなりません。
path = os.path.dirname(filename)
filename から、ディレクトリ名を取り出して外部変数 path に代入します。
次に、ダイアログを表示したときに、このディレクトリが最初に表示される様にするためです。
picdata = Tkinter.PhotoImage(file = filename)
filename の画像ファイルから PhotoImage オブジェクトを作成します。
label.configure(image = picdata)
ラベルに画像を表示します。
picdata = Tkinter.PhotoImage(width = 64, height = 64)
64 X 64 の大きさで空の PhotoImage オブジェクトを作成します。
label = Tkinter.Label(root, image = picdata)
ラベルに空の画像を表示します。

メニュー

メニューは、Menu() メソッドによって作成します。

#!/usr/bin/env python
import sys
import Tkinter

def func1():
	label.configure(text='Menu 1 selected', bg = col.get())

def func2():
	label.configure(text='Menu 2 selected', bg = col.get())

root = Tkinter.Tk()

menubar = Tkinter.Menu(root)
root.configure(menu = menubar)
submenu1 = Tkinter.Menu(menubar, tearoff = False)
submenu2 = Tkinter.Menu(menubar, tearoff = False)
menubar.add_cascade(label = 'Submenu1', underline = 0, menu = submenu1)
menubar.add_cascade(label = 'Submenu2', underline = 0, menu = submenu2)

submenu1.add_command(label = 'Menu 1', under = 0, command = func1)
submenu1.add_command(label = 'Menu 2', under = 0, command = func2)
submenu1.add_separator
submenu1.add_command(label = 'Exit', under = 0, command = sys.exit)

col = Tkinter.StringVar()
col.set('#ff0000')

submenu2.add_radiobutton(label = 'Red', variable = col, value = '#ff0000')
submenu2.add_radiobutton(label = 'Green', variable = col, value = '#00ff00')
submenu2.add_radiobutton(label = 'Blue', variable = col, value = '#0000ff')

label = Tkinter.Label(root, text='nothing', bg = col.get())
label.pack()

root.mainloop()

最初の状態

Submenu1 の Menu 2 を選んだ状態

Submenu2 の Green にチェックを入れて Submenu1 の Menu 1 を選んだ状態

スクリプト解説

menubar = Tkinter.Menu(root)
メニューを作成します。
root.configure(menu = menubar)
ルートのウインドウにメニューを表示します。
submenu1 = Tkinter.Menu(menubar, tearoff = False)
1つ目のサブメニューを作成します。
submenu2 = Tkinter.Menu(menubar, tearoff = False)
2つ目のサブメニューを作成します。
menubar.add_cascade(label = 'Submenu1', underline = 0, menu = submenu1)
1つ目のサブメニューをメニューに表示します。
menubar.add_cascade(label = 'Submenu2', underline = 0, menu = submenu2)
2つ目のサブメニューをメニューに表示します。
submenu1.add_command(label = 'Menu 1', under = 0, command = func1)
1つ目のサブメニューに、Menu 1 を追加します。
選ばれると、関数 func1 を実行します。
submenu1.add_command(label = 'Menu 2', under = 0, command = func2)
1つ目のサブメニューに、Menu 2 を追加します。
選ばれると、関数 func2 を実行します。
submenu1.add_separator
Menu 2 の下にセパレータを表示します。
submenu1.add_command(label = 'Exit', under = 0, command = sys.exit)
1つ目のサブメニューに、Exit を追加します。
選ばれると、関数 sys.exit を実行してスクリプトを終了します。
col = Tkinter.StringVar()
文字列を保持するオブジェクトを作成します。
このStringVarは、Variable クラスのサブクラスです。
col.set('#ff0000')
そのオブジェクトに赤色を表す文字列 '#ff0000' を設定します。
submenu2.add_radiobutton(label = 'Red', variable = col, value = '#ff0000')
2つ目のサブメニューに、ラジオボタンを追加します。
以下の2つのラジオボタンのいづれかが選ばれます。
このラジオボタンが選ばれると、オブジェクト col に、値 '#ff0000' が設定されます。
submenu2.add_radiobutton(label = 'Green', variable = col, value = '#00ff00')
2つ目のサブメニューに、2つ目のラジオボタンを追加します。
submenu2.add_radiobutton(label = 'Blue', variable = col, value = '#0000ff')
2つ目のサブメニューに、3つ目のラジオボタンを追加します。

Canvas の保存

Canvas に表示された図形を保存するには、Canvas の postscript() メソッドを使用します。
以下のスクリプトでは、Save ボタンを押すと表示されている図形が tmp.ps に保存されます。

#!/usr/bin/env python
import Tkinter

def saveImage():
	c.postscript(file = 'tmp.ps')

root = Tkinter.Tk()
c = Tkinter.Canvas(root, width = 200, height = 200)
c.pack()
c.create_oval(20, 20, 150, 150, fill = '#ff0000')
c.create_oval(100, 100, 180, 180, fill = '#00ff00')

b = Tkinter.Button(root, text='Save', command=saveImage)
b.pack()

root.mainloop()

保存されたPSファイル

スクリプト解説

c.postscript(file = 'tmp.ps')
Canvas に表示されている図形を tmp.ps に保存します。
このメソッドによって保存できるのは Postscript 形式です。

練習問題

  1. 前回のスクリプトを元にして、以下の様にして見ましょう。

    メニューは、File メニューに Save と Exit メニューを表示してください。
    Save
    ファイルダイアログを表示して、保存するファイルを選択します。
    ファイルがすでに存在する場合は、ダイアログを表示して確認するようにしてください。
    また、一度ファイルを保存したディレクトリを覚えておいて、次回も同じディレクトリが表示されるようにしてください。
    Exit
    スクリプトを終了します。

Prev | Next
index | home
abetmhr@gmail.com