mieki256's diary



2015/06/18(木) [n年前の日記]

#3 [python] Python + Tkinterを勉強中

ググってたら、どうやら Tkinter はキャンバス上に表示した画像をマウスドラッグで移動することが簡単にできるらしいと知り。昨日作ったようなツールを比較的簡単に書けるのかなと興味が湧いたので少し勉強中。

とりあえず画像を表示してドラッグ移動することはできたので、Frame に、メニューその他を追加できるかどうか試したり。

underの指定。 :

メニューバー(Menu)追加時の under だか underline だかの指定がよく分からなかったけど。 _Tkinter ウィンドウにメニューをつける。 - Cassiopeiaの日記 を眺めて、そういうことかと。要するに、メニューに表示する文字列内の、何番目の文字を Alt + 英数字キーに割り当てるか、という指定なのですな。
# 文字は、0,1,2,3番目、と数える。

# under=0 が指定されてるから、「Save」の、0番目の文字の「S」が使われる。
menu_file.add_command(label="Save", under=0, command = self.save_project, accelerator="Ctrl+S")

# under=5 が指定されてるから、「Save as...」の、5番目の文字の「a」が使われる。
menu_file.add_command(label="Save as...", under=5, command = self.save_as_project, accelerator="Shift+Ctrl+S")

# under=1 が指定されてるから、「Exit」の、1番目の文字の「x」が使われる。
menu_file.add_command(label="Exit", under=1, command = self.quit, accelerator="Ctrl+Q")

Tkinterのショートカットキー関係。 :

Shift + Ctrl + 英字キーを割り当てる時、英字キーは大文字で指定しておかないといけない。
self.bind_all("<Shift-Control-S>", self.save_as_project)

self.bind_all("<Control-q>", self.quit)
Shiftキーが押されることで、大文字が入力されるから、とのこと。

以下は Tcl/Tkの解説だけど、参考になりました。ありがたや。

_イベント処理
次の例は Contorol キー、Shift キー、ALT キーを扱う例です。

1 : bind . <Control-ButtonPress-1> {puts "Control and mouse button 1 is pressed."}
2 : bind . <Shift-KeyPress-A> {puts "Shift-A is pressed."}
3 : bind . <Alt-KeyPress-b> {puts "Alt-B is pressed."}
4 : bind . <Shift-Control-KeyPress-C> {puts "Shift-Control-C is pressed."}

Alt キーのときは「b」としているのに、 Shift キーが関わっているときには「A」のように大文字にしています。 これは Shift キーと同時にアルファベットキーを押すと大文字になるからですね。 したがって、キーボードの Caps Lock をオンにすると、 上記のキーに関するイベントは反応しなくなります (大文字と小文字が逆になるからです)。

イベント処理 より


ここでちと気になる動作が。

自分の環境は、CapsLockキーをCtrlキーとして使う設定にしてあるのだけど。どうやら Tkinter (Python 2.7.10 同梱版)では、Shift + Ctrl + 英数字キーをバインドした際、CapsLock を Ctrl として扱ってくれないようで。
  • Shift + CapsLock(Ctrl化) + 英数字キーは無反応。
  • Shift + Ctrl(本物のCtrl) + 英数字キーなら反応する。

これが単に、Ctrl + 英数字キーのバインドだったら、CapsLock(Ctrl化) + 英数字キーも反応してくれるのだけど。ちょっとよく分からない動作だなと。

終了のさせ方。 :

_python - Close a tkinter window? - Stack Overflow によると、sysy.exit(0) でも終了できるけど、root.quit()、self.parent.quit() でも終了できるらしい。後者は、 root = Tk() とかしてないとダメだけど。

以上です。

過去ログ表示

Prev - 2015/06 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project