[[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)