tkinter
Tcl/TkのPython Wrapper
カスタムイベント
API: https://www.tcl.tk/man/tcl/TkCmd/event.html#M28
以下を実行すると、だいたいわかる
code:python
class Main(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.button = tk.Button(self, command=self.on_press, text="do")
self.button.pack()
self.w = Widget(self)
self.w.pack()
self.w.bind('<<fuga>>', self.on_fuga)
def on_press(self):
self.w.run()
def on_fuga(self, event=None):
print('fuga!!, {}'.format(event.x))
self.e = event
class Widget(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
def run(self):
self.event_generate("<<fuga>>", x=1)
if __name__ == '__main__':
app = tk.Tk()
m = Main(app)
m.pack()
app.mainloop()
event_generate関数について
イベントはイベントキューに入る。キューへの入れ方を指定するのがwhenオプション。
Tcl/TKにはあるdataフィールドがTkinterでは現状使えないため、基本的にイベントを発生させることはできても、付随的なデータの授受はできない。
ただし、Tkinterのイベントは、widgetフィールドがを有するので、イベントを発泡したヴィジェットにデータを持たせておけば、イベントからそのデータへアクセスできる。
Tips
マウスドラッグ
イベント処理に時間がかかると、ドラッグ処理中に次のドラッグイベントの処理が始まり、重くなる。
前のドラッグ処理中は、次のドラッグ処理をスキップするなどすると早くなるが、下手をするとドラッグが飛ばされる・・・