猫空(マオコン)で台湾唯一(らしい...)ロープウェイに乗ってきました。

Cassiopeia2007-08-28

 猫空は台湾の台北近郊(台北から電車で一時間弱)にある茶葉産地です。茶芸館がたくさんあり、台北市街を一望でき景色も最高でした。
 しかし、炎天下でのロープウィイの蒸し暑さはどうにかならないのだろうか。

 

Tkinter イベントのバインディング の続き - Tkinter Event and binding

前回はこちら。


プロトコルイベント - Protocols
イベントを受け取る widget は root もしくは Toplevel widget でないといけない。

イベント 説明
WM_DELETE_WINDOW ウィンドウが閉じられる時に発生。
# -*- coding: utf-8 -*-

#ウィンドウを閉じようとするとメッセージボックスが出る。

from Tkinter import *
import tkMessageBox

def callback():
    if tkMessageBox.askokcancel("Quit?", "Do you like to quit?"):
        root.destroy()

root = Tk()
root.protocol("WM_DELETE_WINDOW", callback)

root.mainloop()

イベントオブジェクトが保持している属性。- About Event Object

属性名 説明
event.widget イベントを受け取った widgetインスタンス
event.x 現在のマウスポインターの x 位置。(ピクセル)
event.y 現在のマウスポインターの y 位置。(ピクセル)
event.x_root 現在のマウスポインターの 画面上の x 位置。(ピクセル)
event.y_root 現在のマウスポインターの 画面上の y 位置。(ピクセル)
event.char キーボードイベント時のみ、キャラクタを文字で返す。
event.keysym キーボードイベント時のみ、そのキーのシンボル。
event.keycode キーボードイベント時のみ、このキーのキーコード。
event.num マウスボタンイベント時のみ、押されたマウスボタンのボタン番号。
event.width Configureイベント時のみ、widget の幅。(ピクセル)
event.height Configureイベント時のみ、widget の高さ。(ピクセル)
event.type イベントのタイプ。
# -*- coding: utf-8 -*-

#マウスのボタンを押すと左-1 真ん中-2 右-3 を表示する。

from Tkinter import *

root = Tk()

def callback(event):
    print event.num

frame = Frame(root, width=100, height=100)
frame.bind("<Button>", callback)
frame.focus_set()
frame.pack()

root.mainloop()

Tkinter イベントのバインディング - Tkinter Event and binding

 Tkinterウィジェット(widget) はユーザーのマウス操作、キーボード操作やウィンドウマネージャーからのイベントを受け取ることが出来る。
 もし、ウィジェット(widget) に記述されたイベントが起こったら対応するイベントハンドラを実行する。下記の例だと widget (frame) に記述されたイベント() が起こったら対応するイベントハンドラ (callback) が実行される。

# -*- coding: utf-8 -*-

from Tkinter import *

root = Tk()

def callback(event):
    print "clicked at", event.x, event.y

frame = Frame(root, width=100, height=100)
frame.bind("<Button-1>", callback)
frame.pack()

root.mainloop()


 次の例はキーボードが押されるとそのキーの文字を表示する。キーボードイベントはその widget にフォーカスがないと受け取れない。(ウィンドウのフォーカスとは別に) frame.forcus_set() のようにしてからでないとその widget はキーボードイベントを受け取ってくれない。

# -*- coding: utf-8 -*-

from Tkinter import *

root = Tk()

def key(event):
    print "pressed", repr(event.char)

frame = Frame(root, width=100, height=100)
frame.bind("<Key>", key)
frame.focus_set()
frame.pack()

root.mainloop()


イベントいろいろ - Events

イベント 説明
左マウスボタンが押された時に発生。
真ん中マウスボタンが押された時に発生。
右マウスボタンが押された時に発生。
# -*- coding: utf-8 -*-

#左ボタンをwidget上で押すとその座標を表示する。

from Tkinter import *

root = Tk()

def callback(event):
    print "clicked at", event.x, event.y

frame = Frame(root, width=100, height=100)
frame.bind("<Button-1>", callback)
frame.pack()

root.mainloop()
イベント 説明
左ボタンを押しながらマウスを動かすと発生。
真ん中ボタンを押しながらマウスを動かすと発生。
右ボタンを押しながらマウスを動かすと発生。
# -*- coding: utf-8 -*-

#widget上で右ボタンを押しながらマウスを動かすと
#その座標を表示する。

from Tkinter import *

root = Tk()

def callback(event):
    print "pointer is", event.x, event.y

frame = Frame(root, width=100, height=100)
frame.bind("<B3-Motion>", callback)
frame.pack()

root.mainloop()
イベント 説明
左ボタンを押してそのボタンを放した時に発生。
真ん中ボタンを押してそのボタンを放した時に発生。
右ボタンを押してそのボタンを放した時に発生。
# -*- coding: utf-8 -*-

#widget上で左ボタンを放した時にその座標を表示する。

from Tkinter import *

root = Tk()

def callback(event):
    print "ButtonReleased at", event.x, event.y

frame = Frame(root, width=100, height=100)
frame.bind("<ButtonRelease-1>", callback)
frame.pack()

root.mainloop()
イベント 説明
左ボタンをダブルクリックした時に発生。
真ん中ボタンをダブルクリックした時に発生。
右ボタンをダブルクリックした時に発生。
左ボタンをトリプルクリックした時に発生。
真ん中ボタンをトリプルクリックした時に発生。
右ボタンをトリプルクリックした時に発生。
# -*- coding: utf-8 -*-

#widget上で左ボタンをダブルクリックした時に
#その座標を表示する。

from Tkinter import *

root = Tk()

def callback(event):
    print "clicked at", event.x, event.y

frame = Frame(root, width=100, height=100)
frame.bind("<Double-Button-1>", callback)
frame.pack()

root.mainloop()
イベント 説明
マウスポインターが widget に入った時に発生。
# -*- coding: utf-8 -*-

#マウスポインターが widget に入った時に
#その座標を表示する。

from Tkinter import *

root = Tk()

def callback(event):
    print "Entered from", event.x, event.y

frame = Frame(root, width=100, height=100)
frame.bind("<Enter>", callback)
frame.pack()

root.mainloop()
イベント 説明
マウスポインターが widget から出た時に発生。
# -*- coding: utf-8 -*-

#マウスポインターが widget から出た時に
#その座標を表示する。

from Tkinter import *

root = Tk()

def callback(event):
    print "Leaved from", event.x, event.y

frame = Frame(root, width=100, height=100)
frame.bind("<Leave>", callback)
frame.pack()

root.mainloop()
イベント 説明
キーボードフォーカスが wiget に移った時に発生。
キーボードフォーカスを wiget が失った時に発生。
イベント 説明
Enter キーが押された時に発生。
Break キーが押された時に発生。
BackSpace キーが押された時に発生。
Tab キーが押された時に発生。
左Shift キーが押された時に発生。
右Shift キーが押された時に発生。
左Control キーが押された時に発生。
右Control キーが押された時に発生。
左Alt キーが押された時に発生。
右Alt キーが押された時に発生。
Pause キーが押された時に発生。
Caps Lock キーが押された時に発生。
Escape,Esc キーが押された時に発生。
Page Up キーが押された時に発生。
Page Down キーが押された時に発生。
End キーが押された時に発生。
Home キーが押された時に発生。
Left,左矢印 キーが押された時に発生。
Up,上矢印 キーが押された時に発生。
Right,右矢印 キーが押された時に発生。
Down,下矢印 キーが押された時に発生。
Print キーが押された時に発生。
< Insert > Insert キーが押された時に発生。
< Delete > Delete キーが押された時に発生。
の各キーが押された時に発生。
Num Lock キーが押された時に発生。
Scroll Lock キーが押された時に発生。
space キーが押された時に発生。
左windows キーが押された時に発生。
右windows キーが押された時に発生。
アプリケーション キーが押された時に発生。
キーボードのなんかのボタンが押されたら発生。
1 キーボードの 1 のボタンが押されたら発生。
<1> マウスの左のボタンが押されたら発生。
3 キーボードの 3 のボタンが押されたら発生。
<1> マウスの右のボタンが押されたら発生。
Shift を押しながら上矢印が押された時に発生。
widget のサイズを変更した時に発生。

明日はプロトコルイベントです。

Tkinter(tkFileDialog) を使ってファイルを開くダイアログを使ってみる。

Cassiopeia2007-08-19

# -*- coding: utf-8 -*-

import Tkinter
import tkMessageBox
import tkFileDialog

root=Tkinter.Tk()
root.withdraw()

fTyp=[('テキストファイルとExcelファイル','*.txt;*.csv')]
#複数のタイプを指定することも可能。

iDir='c:/'

#askopenfilename 一つのファイルを選択する。
filename=tkFileDialog.askopenfilename(filetypes=fTyp,initialdir=iDir)

tkMessageBox.showinfo('FILE NAME is ...',filename)

#askopenfilenames 複数ファイルを選択する。
filenames=tkFileDialog.askopenfilenames(filetypes=fTyp,initialdir=iDir)

for f in filenames:
    tkMessageBox.showinfo('FILE NAME is ...',f)

#askdirectory ディレクトリを選択する。
dirname=tkFileDialog.askdirectory(initialdir=iDir)

tkMessageBox.showinfo('SELECTED DIRECROTY is ...',dirname)

#このコードはutf-8で保存する。
  • askopenfilename askopenfilenames askdirectory のオプション
オプション 説明
defaultextension string ユーザが明示的に付加しなかった場合にくっつける拡張子。(open dialog の時は無視される。)
filetypes list (label, pattern)という形のタプル。pattern '*' は全てのファイル。
initialdir string 初期ディレクトリ。
initialfile string 初期ファイル名。
parent widget 親ウィンドウ。ダイアログが閉じた時にフォーカスは親ウィンドウに戻る。
title string ダイアログのボックスのタイトル。

Python で Tkinter を使って MessageBox を表示する。

いろいろなメッセージボックスやダイアログボックスを使ってみる。

# -*- coding: utf-8 -*-

import Tkinter
import tkMessageBox

root = Tkinter.Tk()
root.withdraw()    #←これでTkの小さいウィンドウが非表示になる。

tkMessageBox.showinfo('showinfo','びっくりマーク')
tkMessageBox.showwarning('showwarning','注意マーク')
tkMessageBox.showerror('showerror','エラーマーク')
tkMessageBox.askquestion('showquestion','はい いいえ')
tkMessageBox.askokcancel('askokcancel','OK キャンセル')
tkMessageBox.askyesno('askyesno','はい いいえ')
tkMessageBox.askretrycancel('askretrycancel','再試行 キャンセル')

tkMessageBox.showinfo('改行','メッセージ\n\n途中\n\n改行\nしてみる。')

#このコードはutf-8で保存する。
  • showinfo メッセージボックス







  • showwarnig メッセージボックス







  • showerror メッセージボックス







  • askquestion ダイアログボックス

戻り値:'はい' のときは 'yes'、'いいえ' のときは 'no'







  • askokcancel ダイアログボックス

戻り値:'OK' のときは 'True' 、'キャンセル' のときは 'False'







  • askyesno ダイアログボックス

戻り値:'はい' のときは 'True' 、'いいえ' のときは 'False'







  • askretrycancel ダイアログボックス

戻り値:'再試行' のときは 'True' 、'キャンセル' のときは 'False'








  • Tkの小さいウィンドウ

tk.withdraw() とすることで非表示に出来る。












  • 表示するメッセージの中に '\n' を入れるとメッセージを改行出来る。












メッセージボックスを使ってみる。

# -*- coding: utf-8 -*-

import Tkinter
import tkMessageBox

root = Tkinter.Tk()
root.withdraw()

if tkMessageBox.askyesno('askyesno','はい いいえ'):
    tkMessageBox.showinfo('MESSAGE BOX','はい が押されましたよ。')
else:
    tkMessageBox.showinfo('MESSAGE BOX','いいえ が押されましたよ。')
        
#このコードはutf-8で保存する。

明日はファイルを開くダイアログを使ってみます。

os.listdir ディレクトリ内のファイル、ディレクトリの一覧を表示する。さらに、戻り値(ファイル名、ディレクトリ名)を unicode で取得する。

# -*- coding: utf-8 -*-

import os

TargetPath = 'c:/'

FileList = os.listdir(TargetPath)

for f in FileList:
        print f
        print type(f)

#このコードはutf-8で保存する。

 Python2.3以降では(Macintosh,Unix,Windows の場合。)TargetPath を unicode にすると os.listdir の戻り値であるファイル、ディレクトリ名は unicode となる。
 文字列を操作(たとえば replace だとか)する等は unicode に統一して行わないとうまくいかず 「Python って使って気持ちいい!」となりません。 通りすがりの方のご指摘により削除いたしました。

# -*- coding: utf-8 -*-

import os

TargetPath = u'c:/'    # u をくっつけてunicode

FileList = os.listdir(TargetPath)

for f in FileList:
        print f
        print type(f)   # 戻り値もunicodeになる。

#このコードはutf-8で保存する。


そのほかの 'Cassiopeiaの日記' 内の Python ネタ

レーシック(LASIK)手術を検討してみる。

レーシック手術回避指向思考

 7,8年前から急に視力が落ちてきて眼鏡をするようになった。先日、眼鏡をしたまま寝てしまい起きたら眼鏡のフレームが曲がっていた。どうにかならないかなぁと思った。

  • すごい頑丈な眼鏡にする。

    ごっついセルフレームの眼鏡をしていたこともあったが...曲がりました。

    使い捨てのコンタクトは持っているがほとんど使っていない。目が痛い。

 3っつめの方法をネットで調べてみた。角膜をレーザーで削るらしい。失敗することもあるらしい。副作用も少なからずあるらしい。手術費用がけっこういい値段する。瞳にとんがったものを近づけられるのは耐え難い。(←とんがったものを近づけるのは私のイメージ図です。) そもそもそんなに視力悪くない(裸眼で0.5位) 韓国に旅行に行ったら安い眼鏡をいっぱい買ってこよう...等々、 徐々に手術回避のほうに思考が偏ってきた。
 ちなみに、近藤@はてな氏はレーシック手術を受けたようだ。(LASIK(レーシック)手術で近視を治す) 私にとっては命がけの宇宙旅行よりも覚悟のいる行動に思える。命がけの宇宙旅行でなくレーシック手術を受けてレポートまでしてくれた近藤氏に感謝。

 で、自分自身の手術は...引き続き検討させていただきます。