Felhasználói eszközök

Eszközök a webhelyen


oktatas:programozas:python:wxpython_gui:wxpython_stilus

< wxPython GUI

wxPython Stílus

  • Szerző: Sallai András
  • Copyright © Sallai András, 2011, 2020
  • Licenc: GNU Free Documentation License 1.3

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

Forrás

oktatas/programozas/python/wxpython_gui/wxpython_stilus.txt · Utolsó módosítás: 2020/08/11 09:56 szerkesztette: admin