Tartalomjegyzék
wxPython Stílus
- Szerző: Sallai András
- Copyright © 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: 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