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