Tartalomjegyzék

< wxPython GUI

wxPython Eseménykezelés

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:

mozog.py
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:

bezar.py
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.

ablak.py
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