[[oktatas:programozás:python:wxpython_gui|< wxPython GUI]]
====== wxPython Eseménykezelés ======
* **Szerző:** Sallai András
* Copyright (c) Sallai András, 2020, 2021
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]]
* Web: https://szit.hu
===== Esemény forrásának lekérdezése =====
Ha az egész ablakon figyeljük a wx.EVT_BUTTON esemény bekövetkezését,
egyszerre kezelhetjük az összes nyomógombot. Az eseménykezelőben a
az event objektumból tudjuk kiolvasni, melyik gombot nyomták le.
def InitUi(self):
self.btn1 = wx.Button(self, 1001, label='Egy')
self.btn2 = wx.Button(self, 1002, label='Kettő')
self.btn3 = wx.Button(self, 1003, label='Három')
def InitEvent(self):
self.Bind(wx.EVT_BUTTON, eventHandler)
def eventHandler(self, event):
if event.GetId() == 1001:
print('egy')
elif event.GetId() == 1002:
print('kettő')
elif event.GetId() == 1003:
print('három')
Lekérés widget objektumba, és név kinyerése:
widget = event.GetEventObject()
print(widget.GetName())
===== Gomb és egérmozgás =====
A nyomógombhoz más események is rendelhetők. Például figyelhetjük a gomb
felett mozog az egér.
button.Bind(wx.EVT_MOTION, self.on_motion_button)
Teljes kód:
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
button = wx.Button(self, label="Mehet")
button.Bind(wx.EVT_MOTION, self.on_motion_button)
self.i=0
def on_motion_button(self, event):
self.i+=1
print(self.i)
class ValamiApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app=ValamiApp()
app.MainLoop()
Figyelhetjük akár a gomb átméretezését is:
button.Bind(wx.EVT_SIZE, self.on_motion_button)
===== Ablak események =====
Elkaphatjuk az ablak klasszikus eseményeit:
self.Bind(wx.EVT_CLOSE, self.on_close_window)
Teljes kód:
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
self.button1 = wx.Button(self, label="Egyik")
self.button2 = wx.Button(self, label="Másik")
main_box = wx.BoxSizer(wx.VERTICAL)
main_box.Add(self.button2)
main_box.Add(self.button1)
self.SetSizer(main_box)
self.Bind(wx.EVT_CLOSE, self.on_close_window)
def on_close_window(self, event):
md = wx.MessageDialog(self, 'Biztos?', 'Kérdés',
wx.YES_NO|wx.NO_DEFAULT|wx.ICON_QUESTION)
if md.ShowModal() == wx.ID_YES:
self.Destroy()
else:
event.Veto()
class ValamiApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app=ValamiApp()
app.MainLoop()
===== Ablak billentyűk =====
Az ablakon kiváltott billentyűnyomások
a EVT_CHAR_HOOK eseménnyel kezelhetők.
A EVT_KEY_DOWN és EVT_KEY_UP csak wx.Button komponensnél
használható.
Ilyen esetben a tabulátor sem fog működni, ezért nem engedjük tovább
az eseményt a event.Skip() utasítással.
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
self.button1 = wx.Button(self, label="Egyik")
self.button2 = wx.Button(self, label="Másik")
main_box = wx.BoxSizer(wx.VERTICAL)
main_box.Add(self.button2)
main_box.Add(self.button1)
self.SetSizer(main_box)
self.Bind(wx.EVT_CHAR_HOOK, self.on_char_hook)
def on_char_hook(self, event):
code = event.GetKeyCode()
print(code)
event.Skip()
class ValamiApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app=ValamiApp()
app.MainLoop()
Megvizsgálhatjuk a leütött billentyűket:
def on_char_hook(self, event):
code = event.GetKeyCode()
if code == wx.WXK_LEFT:
print('balra')
if code == wx.WXK_RIGHT:
print('jobbra')
if code == wx.WXK_UP:
print('fel')
if code == wx.WXK_DOWN:
print('le')
event.Skip()
| wx.WXK_SPACE | szóköz |
| wx.WXK_DELETE | törlés |
| wx.WXK_LEFT | balra |
===== Forrás =====
* https://www.tutorialspoint.com/wxpython/wxpython_event_handling.htm (2020)
* https://wxpython.org/Phoenix/docs/html/wx.KeyCode.enumeration.html (2021)
* https://wxpython.org/Phoenix/docs/html/wx.KeyEvent.html (2021)