猫空(マオコン)で台湾唯一(らしい...)ロープウェイに乗ってきました。
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) に記述されたイベント(
# -*- 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) を使ってファイルを開くダイアログを使ってみる。
# -*- 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の小さいウィンドウ
- 表示するメッセージの中に '\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(レーシック)手術で近視を治す) 私にとっては命がけの宇宙旅行よりも覚悟のいる行動に思える。命がけの宇宙旅行でなくレーシック手術を受けてレポートまでしてくれた近藤氏に感謝。
で、自分自身の手術は...引き続き検討させていただきます。