[[oktatas:programozás:python:wxpython_gui|< wxPython GUI]]
====== wxPython méretezők ======
* **Szerző:** Sallai András
* Copyright (c) 2020, Sallai András
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]]
* Web: https://szit.hu
===== Közös Jellemzők =====
==== Minimális méret ====
Általában a minimális méret megegyezik a komponensek kezdeti méretével,
de beállítható a wx.Size mezőben. Nem minden komponens képes
kiszámítani a méretét. A listák, például nem rendelkeznek természetes
szélességgel és magassággal. De van olyan vezérlő, amely kiszámíthatja
a magasságát, de szélességét nem. Ilyen az egy soros szövegvezérlő.
{{:oktatas:programozas:python:wxpython_gui:listbox02.png|}}
==== Szegély ====
A szegély egy üres hely, amely komponensek elválasztására szolgál,
és általában 5 pont széles.
{{:oktatas:programozas:python:wxpython_gui:gombszegely.png|}}
==== Igazítás ====
Ha a komponenseknek rendelkezésre áll hely, akkor azon belül igazíthatók, jobbra, balra és
középre.
{{:oktatas:programozas:python:wxpython_gui:elrendezes01.png|}}
==== Nyúlás ====
Beállíthatjuk, arányaiban mennyi helyet foglaljon egy komponens.
A következő képen az első gomb 2, a másik két gomb 1 arány van beállítva.
{{:oktatas:programozas:python:wxpython_gui:arany01.png|}}
===== Komponens hozzáadása =====
Szintaxis:
Add( komponens, arány=0 , jelző=0 , szegély=0 , userData=Nincs )
* komponens: ablak (vezérlők és statikus komponensek), helykitöltők és újabb méretezők hozzáadása. A kezdeti méret a minimális
* arány: a méretező gyermeke, meg tudja-e változtatni méretét a többi gyermekhez viszonyítva.
* jelző: jelzők vagylagos kombinációja, ami befolyásolja a méretező viselkedését.
* szegély: a szegély méretét adhatjuk meg. A szegélyt jelzővel is jelezni kell.
* userData: extra objektum csatolása a méretező elemhez.
Készítsünk egy függőleges elrendezésű méretezőt (ez a gyermek elemeket egymásra helyezi),
majd tegyünk bele két gombot. Az összes extra paraméter 0-ra állítjuk.
sizer1 = wx.BoxSizer(wx.VERTICAL)
sizer1.Add(wx.Button(self, -1, 'Valami hosszú szöveg a gombon'), 0, 0, 0)
sizer1.Add(wx.Button(self, -1, 'Rövid szöveg'), 0, 0, 0)
self.SetSizer(sizer1)
* Az ilyen módon elhelyezett elemek, a minimális méretet veszik fel.
* Az ablak nem változtatja meg a méretét, hogy illeszkedjen az elemekhez.
{{:oktatas:programozas:python:wxpython_gui:meretezes01.png|}}
Most igazítsuk az ablak méretét a benne található tartalomhoz.
sizer1 = wx.BoxSizer(wx.VERTICAL)
sizer1.Add(wx.Button(self, -1, 'Valami hosszú szöveg a gombon'), 0, 0, 0)
sizer1.Add(wx.Button(self, -1, 'Rövid szöveg'), 0, 0, 0)
sizer1.SetSizeHints(self)
self.SetSizer(sizer1)
{{:oktatas:programozas:python:wxpython_gui:meretezes02.png|}}
Ez hasznos, ha az alapértelmezett ablakméret nem megfelelő.
==== Arány paraméter ====
A sizer1.Add() első paramétere a hozzáadott wx.Window egy leszármazottja, ahogy azt
eddig is láttuk. A második paraméter a gyermek elemek mérete, egymáshoz képest,
vagyis egy arány. Ha méretező függőleges elrendezésű, akkor függőlegesen
határozza meg a gyermekelemek mennyi helyet foglaljanak.
Ebben a példában az első gomb 1 arányszámot, míg a másik gomb 3-s arányszámot kapott.
sizer1 = wx.BoxSizer(wx.VERTICAL)
sizer1.Add(wx.Button(self, -1, 'Valami hosszú szöveg a gombon'), 1, 0, 0)
sizer1.Add(wx.Button(self, -1, 'Rövid szöveg'), 3, 0, 0)
sizer1.SetSizeHints(self)
self.SetSizer(sizer1)
Az alsó gomb 3-szor magasabb mint a felső.
{{:oktatas:programozas:python:wxpython_gui:meretezes03.png|}}
Most legyen a felső gombnak az aránya 5, az alsónak 2:
sizer1 = wx.BoxSizer(wx.VERTICAL)
sizer1.Add(wx.Button(self, -1, 'Valami hosszú szöveg a gombon'), 5, 0, 0)
sizer1.Add(wx.Button(self, -1, 'Rövid szöveg'), 2, 0, 0)
sizer1.SetSizeHints(self)
self.SetSizer(sizer1)
Ha egy elemnek az aránya 0, akkor minimális méretet veszi fel.
sizer1 = wx.BoxSizer(wx.VERTICAL)
sizer1.Add(wx.Button(self, -1, 'Valami hosszú szöveg a gombon'), 0, 0, 0)
sizer1.Add(wx.Button(self, -1, 'Rövid szöveg'), 1, 0, 0)
sizer1.Add(wx.Button(self, -1, 'Harmadik gomb'), 2, 0, 0)
sizer1.SetSizeHints(self)
self.SetSizer(sizer1)
{{:oktatas:programozas:python:wxpython_gui:meretezes06.png|}}
Ugyanazokkal a beállításokkal, de az ablakot nem állítjuk a tartalomhoz:
{{:oktatas:programozas:python:wxpython_gui:meretezes07.png|}}
Ez jól jön, ha szeretnénk az egyik elemünk, csak minimális helyet foglaljon,
a többi pedig töltse ki rendelkezésre álló helyet.
==== Jelzők és a szegély paraméter ====
A harmadik paraméter a jelzők helye, ahol VAGY operátorral
kombináljuk az összes jelzőket. Két viselkedést határozunk meg
ezekkel a jelzőkkel. Az egyik az ablak (komponens vagy elem) körül,
hol legyen szegély. A másik, a méretező változása esetén, hogyan
viselkedjen az elem. A negyedik paraméter a szegély szélessége.
| wx.TOP \\ wx.BOTTOM \\ wx.LEFT \\ wx.RIGHT \\ wx.ALL | Hol legyen szegély |
| wx.EXPAND | Az elem töltse ki a rendelkezésre álló helyet. |
| wx.SHAPED | Az elem vegye fel a lehető legnagyobb méretet, az arányok megtartásával. |
| wx.FIXED_MINSIZE | A wx.Sizer általában a wx.Window.GetEffectiveMinSize segítségével \\ határozza meg a méretet. Ha szeretnénk az eredeti minimális \\ méretet, használjuk a wx.FIXED_MINSIZE-t. |
| wx.RESERVE_SPACE_EVEN_IF_HIDDEN | Általában a wx.Sizer nem foglal helyet rejtett ablakokhoz. \\ Ez a jelző felülbírálja ezt a viselkedést. |
| wx.ALIGN_CENTER vagyr wx.ALIGN_CENTRE \\ wx.ALIGN_LEFT \\ wx.ALIGN_RIGHT \\ wx.ALIGN_RIGHT \\ wx.ALIGN_TOP \\ wx.ALIGN_BOTTOM \\ wx.ALIGN_CENTER_VERTICAL vagy wx.ALIGN_CENTRE_VERTICAL \\ wx.ALIGN_CENTER_HORIZONTAL vagy wx.ALIGN_CENTRE_HORIZONTAL | Igazítás a rendelkezésre álló helyen belül. |
Nézzünk néhány igazítást.
Igazítás középre:
sizer1 = wx.BoxSizer(wx.VERTICAL)
sizer1.Add(wx.Button(self, -1, 'Valami hosszú szöveg a gombon'), 0, 0, 0)
sizer1.Add(wx.Button(self, -1, 'Rövid szöveg'), 0, wx.ALIGN_CENTER, 0)
sizer1.SetSizeHints(self)
self.SetSizer(sizer1)
{{:oktatas:programozas:python:wxpython_gui:meretezes08.png|}}
Igazítás jobbra:
sizer1 = wx.BoxSizer(wx.VERTICAL)
sizer1.Add(wx.Button(self, -1, 'Valami hosszú szöveg a gombon'), 0, 0, 0)
sizer1.Add(wx.Button(self, -1, 'Rövid szöveg'), 0, wx.ALIGN_RIGHT, 0)
sizer1.SetSizeHints(self)
self.SetSizer(sizer1)
{{:oktatas:programozas:python:wxpython_gui:meretezes09.png|}}
A rendelkezésre álló hely elfoglalása, vagyis wx.EXPAND. Szinonima: wx.GROW.
sizer1 = wx.BoxSizer(wx.VERTICAL)
sizer1.Add(wx.Button(self, -1, 'Valami hosszú szöveg a gombon'), 0, 0, 0)
sizer1.Add(wx.Button(self, -1, 'Rövid szöveg'), 0, wx.EXPAND, 0)
sizer1.SetSizeHints(self)
self.SetSizer(sizer1)
{{:oktatas:programozas:python:wxpython_gui:meretezes10.png|}}
A felső gomb felvette a minimális méretet, az alsó pedig megnőtt, és kitölti a
rendelkezésre álló helyet. Ez a beállítás ellentétes módon működik a második paraméterrel.
A wx.EXPAND függőleges méretezőben vízszintes nyúlást eredményez,
vízszintes méretezőben függőleges nyúlást.
A következő a wx.SHAPED. Ez a jelző biztosítja, hogy az adott elem magassága és szélessége
arányos maradjon. Gombok esetén ennek nem sok értelme van, de bitképek esetén, biztosítja,
hogy egy kép ne torzuljon.
sizer1 = wx.BoxSizer(wx.VERTICAL)
sizer1.Add(wx.Button(self, -1, 'Valami hosszú szöveg a gombon'), 0, 0, 0)
sizer1.Add(wx.Button(self, -1, 'Rövid szöveg'), 1, wx.SHAPED, 0)
sizer1.SetSizeHints(self)
self.SetSizer(sizer1)
{{:oktatas:programozas:python:wxpython_gui:meretezes11.png|}}
Ugyanaz átméretezett ablakkal:
{{:oktatas:programozas:python:wxpython_gui:meretezes12.png|}}
A valóságban függőlegesen nem annyira nőtt az arány, mert egy idő után
nem nő.
Végül nézzük meg a szegélyjelzőket. Ha a negyedik paraméter negy nagyobb nullánál,
ezeknek a jelzőknek nincs értelme.
Szegély baloldalon:
sizer1 = wx.BoxSizer(wx.VERTICAL)
sizer1.Add(wx.Button(self, -1, 'Valami hosszú szöveg a gombon'), 0, 0, 0)
sizer1.Add(wx.Button(self, -1, 'Rövid szöveg'), 1, wx.EXPAND | wx.LEFT, 20)
sizer1.SetSizeHints(self)
self.SetSizer(sizer1)
{{:oktatas:programozas:python:wxpython_gui:meretezes13.png|}}
Szegély kétoldalt:
sizer1 = wx.BoxSizer(wx.VERTICAL)
sizer1.Add(wx.Button(self, -1, 'Valami hosszú szöveg a gombon'), 0, 0, 0)
sizer1.Add(wx.Button(self, -1, 'Rövid szöveg'), 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 20)
sizer1.SetSizeHints(self)
self.SetSizer(sizer1)
{{:oktatas:programozas:python:wxpython_gui:meretezes14.png|}}
Két oldalon és felül:
sizer1 = wx.BoxSizer(wx.VERTICAL)
sizer1.Add(wx.Button(self, -1, 'Valami hosszú szöveg a gombon'), 0, 0, 0)
sizer1.Add(wx.Button(self, -1, 'Rövid szöveg'), 1,
wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, 20)
sizer1.SetSizeHints(self)
self.SetSizer(sizer1)
{{:oktatas:programozas:python:wxpython_gui:meretezes15.png|}}
Szegély minden oldalon:
sizer1 = wx.BoxSizer(wx.VERTICAL)
sizer1.Add(wx.Button(self, -1, 'Valami hosszú szöveg a gombon'), 0, 0, 0)
sizer1.Add(wx.Button(self, -1, 'Rövid szöveg'), 1,
wx.EXPAND | wx.ALL, 20)
sizer1.SetSizeHints(self)
self.SetSizer(sizer1)
{{:oktatas:programozas:python:wxpython_gui:meretezes16.png|}}
===== Kontroll rejtése méretezővel =====
A méretezőben elhelyezett vezérlők rejthetők a wx.Window.Show metódussal,
de a méretezők külön módszert biztosítanak erre a célra.
Ehhez hívja a wx.Sizer.Show metódust. Ezt követően frissíteni kell
az elrendezést.
Ezt hasznos, ha a felület egyes részeti el kell rejtenie.
Csak a wx.BoxSizer és a wx.FlexGridSizer támogatja.
===== Méretezők =====
==== BoxSizer ====
A BoxSizer függőlegesen és vízszintesen is elrendezheti a gyermekeit, attól
főggően, hogy milyen jelzőt állítunk be a konstruktorban.
{{:oktatas:programozas:python:wxpython_gui:boxsizer_01_fuggo.png|}}
{{:oktatas:programozas:python:wxpython_gui:boxsizer_02_vizszint.png|}}
==== StaticBoxSizer ====
A StaticBoxSizer megegyezik a BoxSizer-el, de körülveszi egy statikus doboz.
{{:oktatas:programozas:python:wxpython_gui:staticboxsizer_01.png|}}
rootBox = wx.BoxSizer(wx.HORIZONTAL)
sizer1 = wx.StaticBoxSizer(wx.HORIZONTAL, self, "Szöveg")
rootBox.Add(sizer1, 0, wx.ALL, 10)
sizer1.Add(wx.Button(self, -1, 'Ok'), 0, wx.LEFT | wx.TOP | wx.BOTTOM, 10)
sizer1.Add(wx.Button(self, -1, 'Ok'), 0, wx.LEFT | wx.TOP | wx.BOTTOM, 10)
sizer1.Add(wx.Button(self, -1, 'Ok'), 0, wx.ALL, 10)
rootBox.SetSizeHints(self)
self.SetSizer(rootBox)
==== GridSizer ====
A wx.GridSizer egy két dimenziós méretező.
Minden gyermek azonos méretű helyet kap.
A legnagyobb méretű gyermek határozza meg
ezt a méretet. Az oszlopok és a sorok
számra rögzítve van.
{{:oktatas:programozas:python:wxpython_gui:gridsizer_01.png|}}
textctrl1 = wx.TextCtrl(self, -1, 'Szöveg', style=wx.TE_MULTILINE)
textctrl1.SetMinSize((150, 100))
textctrl2 = wx.TextCtrl(self, -1, 'Szöveg', style=wx.TE_MULTILINE)
textctrl2.SetMinSize((50, 100))
rootBox = wx.GridSizer(2, (0,0))
rootBox.Add(wx.CheckBox(self, -1, 'Jelölő'), 1, wx.ALL, 5)
rootBox.Add(wx.Button(self, -1, 'Ok'), 1, wx.ALL, 5)
rootBox.Add(textctrl1, 1, wx.EXPAND | wx.ALL, 5)
rootBox.Add(textctrl2, 1, wx.EXPAND | wx.ALL, 5)
rootBox.SetSizeHints(self)
self.SetSizer(rootBox)
==== FlexGridSizer ====
{{:oktatas:programozas:python:wxpython_gui:flexgridsizer_01.png|}}
textctrl1 = wx.TextCtrl(self, -1, 'Szöveg', style=wx.TE_MULTILINE)
textctrl1.SetMinSize((150, 100))
textctrl2 = wx.TextCtrl(self, -1, 'Szöveg', style=wx.TE_MULTILINE)
textctrl2.SetMinSize((50, 100))
rootBox = wx.FlexGridSizer(2, (0,0))
rootBox.Add(wx.CheckBox(self, -1, 'Jelölő'), 1, wx.ALL, 5)
rootBox.Add(wx.Button(self, -1, 'Ok'), 1, wx.ALL, 5)
rootBox.Add(textctrl1, 1, wx.EXPAND | wx.ALL, 5)
rootBox.Add(textctrl2, 1, wx.EXPAND | wx.ALL, 5)
rootBox.SetSizeHints(self)
self.SetSizer(rootBox)
===== Programozás BoxSizer-rel =====
A wx.BoxSizer segítségével hierarchikus, soros és oszlopos elrendezést
használhatunk.
===== Forrás =====
* https://wxpython.org/Phoenix/docs/html/sizers_overview.html (2020)