[[:oktatas:programozás:python:wxpython_gui|< wxPython GUI]]
====== wxPython Stílus ======
* **Szerző:** Sallai András
* Copyright (c) Sallai András, 2011, 2020
* Licenc: GNU Free Documentation License 1.3
* Web: http://szit.hu
===== Ajánlás =====
Ez egy kisebb stílus bemutató a wxPythonhoz. Nem írja le egészében hogyan kell wxPython kódot írni, de leírja hogyan írhatunk tiszta kódot.
A Python stílus követi a pythonizmus elveit: [[oktatas:programozás:python:pythonizmus]]
http://www.python.org/doc/humor/#the-zen-of-python
Ez a dokumentum leírja, hogyan használjuk a wxPython osztályokat és struktúrákat.
===== 1. =====
A wx importálásához, ne használd a //import wx from *// vagy a //from wxPython.wx import *// formát.
A mélyen eltemetett modulokhoz, használd ezt:
from wx.lib.ValamiLib.ValamiModul.AzOsztaly
===== 2.a =====
Ha úgy gondolod, hogy egy konstruktorban túl sok felesleges paramétert
adsz meg, például wx.DefaultSize, wx.DefaultPosition, wx.ID_ANY stb., használj kulcsparamétereket.
MainFrame = wx.Frame(None, title="Cím", size=(800, 600))
* Mert: Az explicit kifejezés jobb mint az implicit.
===== 2b. =====
Használd a *args és a **kwargs paramétereket, amikor wx.Windows alosztályt hozol létre:
class MyPanel(wx.Panel):
"""Ez a panel néhány szokásos dologgal"""
def __init__(self, *args, **kwargs):
"""Bemutató panel készítése"""
wx.Panel.__init__(self, *args, **kwargs)
Ez lehetővé teszi, hogy az egyedi ablakok, ugyanazokat a paramétereket
fogadják el mint az alap szabványos ablak. Így nem szükséges előre
tudni, mi lehet hasznos.
===== 3. =====
Ne használj azonosítót, azaz ID-t.
* Mert: Az egyszerű jobb mint a bonyolult.
* A widget konstruktor egy alapértelmezett ID-val fog létrejönni, így nem kell megadni azokat. A többi paramétert, pedig adjuk meg kulcsokkal.
MyFrame = wx.Frame(None, title="Cím", size=(400,400))
AButton = wx.Button(self, label="Nyomj meg")
Ha az id szükséges, használd a wx.ID_ANY-t. A wx.ID_ANY == -1.
Természetesen használhatod a kódban a -1 formát is, de
a wx.ID_ANY átláthatóbbá teszi a kódot.
Ki tudja, ez a varázslatos érték talán megváltozik egy nap.
A wx.ID_ANY, mindenesetre öndokumentáló, leíró jellegű.
Használj ilyen állandókat a programozás során.
* Mert: Az explicit kifejezés jobb, mint az implicit.
==== Kivétel ====
Mindig van egy kivétel!
* Használd az ID-kat a szabványos menük, gombok esetén.
* Ez hasznos, mert így használhatod, a rendszer alapértelmezett függvényeit.
Példák
* wxMac - menüpontok átalakítása
* párbeszédpanel automatikus kitöltése vagy elvetése (Cancel)
* a nyomógomb készlet feliratok és képek használata
* stb.
Az ilyen szabványos azonosítók listája wxWidgets referencia kézikönyv
Constans -- Stock items szakasztban találhatók.
Példa:
item = FileMenu.Append(wx.ID_EXIT, "&Quit")
Ez egy Quit menü, ahol meghívjuk a beépített kilépési függvényt.
===== 4. =====
Használd a Bind() metódust kötések létrehozásához:
* Nyomógomb példa:
AButton = wx.Button(self, label="Nyomj meg")
AButton.Bind(wx.EVT_BUTTON, self.OnButtonPush)
Használhatod a Bind() függvényt a menükhöz is, még akkor is ha
magának a menünek nincs ilyen.
FileMenu = wx.Menu()
item = FileMenu.Append(wx.ID_EXIT, "&Quit")
self.Bind(wx.EVT_MENU, self.OnQuit, item)
(A self itt egy wx.Frame)
===== 5. =====
Használj méretezőket (Sizer)! Ha méretezőket használsz az abszolút pozicionálás helyett, akkor olyan kódot kapsz:
* Platformonként jobb eredményeket kapunk:
* Különböző platformokon különböző méretű komponensek lehetnek.
* Könnyen adaptálható különböző nyelveken:
* A különböző nyelveken különböző méretű feliratok vannak.
* Egy platformon is, más felhasználó, font és kinézet értékeket használhat.
* Karbantarthatóbb:
* Ha valamit le kell cserélned, megszüntetned, vagy hozzáadnod egy új komponenst, a panel vagy a dialógus önmagát újraméretezi.
===== 6. =====
wx.App() ugyanazokkal a funkcionalitásokkal bír, mint a wx.PySimpleApp(),
* így nincs szükség az utóbbira.
===== 7. =====
Használj különálló, egyedi osztályokat, ahelyett, hogy egy osztályba teszel több wx.Panels-t. Egy panel, egy osztály.
Ha csinálsz egy __init__ metódust:
self.MainPanel = wx.Panel(self, ...
self.SubPanel1 = wx.Panel(self.MainPanel, ..)
self.SubPanel2 = wx.Panel(self.SubPanel1, ...)
MyButton = wx.Button(self.SubPanel2, ....)
Akkor egy csúnya eredményt kapsz. E helyett készít egy
szokásos osztályt egy panellel együtt:
class MainPanel(wx.Panel):
#...
class SubPanel1(wx.Panel):
# ...
===== 8. =====
Használj natív Python megoldást ha lehet, a wx megoldások helyett:
* Mert: Az egyszerűbb jobb mint a komplex.
Például használd size=(500, 400) a következő helyett: size=wx.Size(500, 400)
===== 9. =====
Használd a dokumentációs szövegeket következetesen.
===== 10. =====
Amikor egy dialógusablak alosztály használsz, a gombok korrekt
elhelyezéséhez, használd a szabványos wx.ID-kat, a StdDialogButtonSizer méretezővel.
okButton = wx.Button(self, wx.ID_OK, "&OK")
okButton.SetDefault()
cancelButton = wx.Button(self, wx.ID_CANCEL, "&Cancel")
btnSizer = wx.StdDialogButtonSizer()
btnSizer.AddButton(okButton)
btnSizer.AddButton(cancelButton)
btnSizer.Realize()
===== Példa =====
#!/usr/bin/env python2.4
"""
Ez egy kis wxPython alkalmazás,
amely bemutatja hogyan írjuk pythonos
wxPython kódot.
"""
import wx
class DemoPanel(wx.Panel):
"""Ez a panel két gombot tartalmaz, de igazából nem csinál semmit."""
def __init__(self, parent, *args, **kwargs):
"""Bemutatópanel létrehozása."""
wx.Panel.__init__(self, parent, *args, **kwargs)
self.parent = parent # Néha használhatsz inline megjegyzéseket
NothingBtn = wx.Button(self, label="Semmit nem tesz hosszú címke")
NothingBtn.Bind(wx.EVT_BUTTON, self.DoNothing )
MsgBtn = wx.Button(self, label="Üzenet küldése")
MsgBtn.Bind(wx.EVT_BUTTON, self.OnMsgBtn )
Sizer = wx.BoxSizer(wx.VERTICAL)
Sizer.Add(NothingBtn, 0, wx.ALIGN_CENTER|wx.ALL, 5)
Sizer.Add(MsgBtn, 0, wx.ALIGN_CENTER|wx.ALL, 5)
self.SetSizerAndFit(Sizer)
def DoNothing(self, event=None):
"""Nem csinál semmit."""
pass
def OnMsgBtn(self, event=None):
"""Szól egy wx.MessageDialog üzenet."""
dlg = wx.MessageDialog(self,
message='Egy üzeent',
caption='Üzenetdoboz',
style=wx.OK|wx.ICON_INFORMATION
)
dlg.ShowModal()
dlg.Destroy()
class DemoFrame(wx.Frame):
"""Főablakon egy panel."""
def __init__(self, *args, **kwargs):
"""Bemutatóablak létrehozása."""
wx.Frame.__init__(self, *args, **kwargs)
# Menüsáv készítése
MenuBar = wx.MenuBar()
FileMenu = wx.Menu()
item = FileMenu.Append(wx.ID_EXIT, text="&Quit")
self.Bind(wx.EVT_MENU, self.OnQuit, item)
MenuBar.Append(FileMenu, "&File")
self.SetMenuBar(MenuBar)
# Panel komponens (Widget) hozzáadása
self.Panel = DemoPanel(self)
self.Fit()
def OnQuit(self, event=None):
"""Kilépés az alkalmazásból."""
self.Close()
if __name__ == '__main__':
app = wx.App()
frame = DemoFrame(None, title="Minialkalmazás")
frame.Show()
app.MainLoop()
===== Történet =====
* 2006-11-01 - Első leírás Chris Barker, egy kis segítséggel a wxPython-users levelezőlistáról.
* 2006-01-16 - Franz Steinhaeusler,
* 2010-01-14 - StdDialogButtonSizer hozzáadva "docstrings for init methods"
* 2011-02-05 - Magyarra fordította: Sallai András
===== Forrás =====
* https://wiki.wxpython.org/wxPython%20Style%20Guide (2020)