[[oktatas:programozás:python:wxpython_gui|< wxPython]]
====== wxGlade ======
* **Szerző:** Sallai András
* Copyright (c) Sallai András, 2020, 2021
* Licenc: GNU Free Documentation License 1.3
* Web: https://szit.hu
===== A wxGlade =====
A wxGlade egy **vizuális tervező** eszköz, wxWidgets, wxPython programok írásához.
A wxGlade használható a szerkesztővel párhuzamosan. A generált kódba
beleilleszt olyan jelölőket, amiből láthatjuk, hogy mi az amit ő szerkeszt és
mit szerkeszthetünk mi.
Webhely:
* https://github.com/wxGlade/wxGlade/ (2021)
* http://wxglade.sourceforge.net/ (2021)
===== Telepítés Windowson =====
Követelmény egy telepített Python3. Függőség telepítése:
pip install wxpython
A wxGlade csomagot letöltjük a weboldalról, kicsomagoljuk:
* https://sourceforge.net/projects/wxglade/
===== Telepítés Linuxon =====
wxPython függőségek telepítése:
apt install libgtk-3-dev
Csomagból:
apt install wxglade
===== Indítás =====
==== Linuxon ====
* Start > Programozás > wxGlade
==== Windowson ====
* Keressük meg a kicsomagolt könyvtárban a wxglade.pyw állományt.
* wxglade.pyw
===== Képernyőkép =====
==== wxGlade 0.8 ====
{{:oktatas:programozas:python:wxpython_gui:wxglade_linux.png|}}
==== wxGlade 0.9 ====
{{:oktatas:programozas:python:wxpython_gui:wxglade_windows.png|}}
===== Fejlesztői környezet =====
Ajánlás:
* wxGlade
* PyCharm
A **PyCharm** és a **wxGlade** nagyon jól kiegészítik egymást.
A wxGlade felületein fejlesztés közben tudjuk a kódot
szerkeszteni, amíg a kódot a PyCharm-ban írjuk.
===== Frame =====
Tegyünk fel egy keretet:
* Add Frame
A Windows ikonsor, első ikonja.
Írjuk ki a forráskódot.
Legyen kijelölve a fanézetben a "Application", majd
kattintás:
* "Generate Source
* Language: Python
* Mark code blocks [✔]
A generált forráskód:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
# generated by wxGlade 0.9.6 on Mon Jul 27 15:01:08 2020
#
import wx
# begin wxGlade: dependencies
# end wxGlade
# begin wxGlade: extracode
# end wxGlade
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: MyFrame.__init__
kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.SetSize((400, 300))
self.__set_properties()
self.__do_layout()
# end wxGlade
def __set_properties(self):
# begin wxGlade: MyFrame.__set_properties
self.SetTitle("frame")
# end wxGlade
def __do_layout(self):
# begin wxGlade: MyFrame.__do_layout
sizer_1 = wx.BoxSizer(wx.VERTICAL)
sizer_1.Add((0, 0), 0, 0, 0)
self.SetSizer(sizer_1)
self.Layout()
# end wxGlade
# end of class MyFrame
class MyApp(wx.App):
def OnInit(self):
self.frame = MyFrame(None, wx.ID_ANY, "")
self.SetTopWindow(self.frame)
self.frame.Show()
return True
# end of class MyApp
if __name__ == "__main__":
app = MyApp(0)
app.MainLoop()
Azok a kódrészek, amikhez nem nyúlhatunk meg vannak jelölve így:
# begin wxGlade: Valami leírás
# end wxGlade:
Amit ezen kívül írunk az csak egy esetben marad meg.
* Legyen kijelölve fastruktúra nézetben az "Application".
* Keep user code [✔]
{{:oktatas:programozas:python:wxpython_gui:applicationselected.png|}}
A "**Keep user code**" legyen kipipálva. Ha ez ki van pipálva és
generálunk egy új kódot a **# begin wxGlade** és **# end wxGlade**
részen kívüli részt nem fogja törölni a generátor.
{{:oktatas:programozas:python:wxpython_gui:keep_user_code_selected.png|}}
Ha ezt így beállítjuk a párhuzamosan tudunk dolgozni a wxGlade
tervezővel és egy kódszerkesztővel, vagy fejlesztői környezettel
(például PyCharm, Geany).
A generált app.py forráskódot ne szerkesszük, azt a wxGlade mindig újraírja.
===== Példa program kinézet =====
Az alábbiakban egy egyszerű alakalmazást látunk a következő osztályok felhasználásáva:
* wxApp
* wxFrame
* wxButton
* wxTextCtrl
* wxBoxSize
{{:oktatas:programozas:python:wxpython_gui:haromszog_wxglade.png|}}
===== Slot =====
A Slot a wxGlade felület saját tárolója. A wxWidgets programozói könyvtár nem tartalmaz ilyen
tárolót. A Slot jelzi, hogy oda tehetünk widgest komponenseket.
{{:oktatas:programozas:python:wxpython_gui:wxglade_slot.png|}}
A Slotokban helyezhetünk el vezérlőket (gomb, beviteli doboz stb.).
A Slotokat a méretezők (angolul Sizers) felett, jobb egérrel
kattintva tudunk felvenni. A Slotnak mindig egy méretezőből kell
kiindulnia. Ha felteszünk egy méretezőt, minimum 1 Slot-ja lesz.
Ha több van, akkor a Slot felett jobb egér gombbal kattintva törölhető.
Ezek alapján, elmondhatjuk, hogy a slotokat sosem látjuk viszzont
a forráskódban.
===== Sizer =====
A méretezők, angolul Sizer, egy-egy wxwidgets komponens, a vezérlők elhelyezését,
méretezését szabályozzák.
A wxGlade-ben a feltehető méretezőkből kettő van:
* BoxSizer
* GridSizer
Ezek ugyan megfelelnek két wxWidgets méretezőnek,
de a "Properties" ablakban válthatunk a wxWidgets méretezői között.
A "Properties" a következő méretezőket tartalmazza:
* wxBoxSizer
* wxStaticBoxSizer
* wxWrapSizer
* wxGridSizer
* wxFlexGridSizer
* wxGridBagSizer
A feltehető komponensek közül, célszerű a grid jellegű méretezők esetén, a GridSizer választása,
a többi esetben maradhat a BoxSizer.
{{:oktatas:programozas:python:wxpython_gui:meretezotipusok.png|}}
===== Vezérlők =====
* A vezérlőket mindig a **fastruktúra** vagy a tervező ablakra kell húzni.
* Figyelem: Csak Slot területre húzhatunk vezérlőt.
* Másolás:
* 1) A fastruktúrában a vezérlők másolhatók egérhúzással.
* 2) A tervezőablakban egérhúzással.
* Mozgatás: Ha áthelyezést szeretnénk, akkor Shift nyomva tartása mellett húzzunk egérrel.
A másolás és a mozgatás, mindig Slotok között történhet. Mindig Slotból, slotba.
{{:oktatas:programozas:python:wxpython_gui:vezerlokelhelyezese.png|}}
===== StaticText =====
A StaticText felirata (Label) a SetLabel() függvénnyel írható.
A wxGlade tervező felületen be kell állítani az attribútumnak:
* Properties > Common > Store as attribute [✔]
===== TextCtrl =====
Váltás jelszó stílus és normál stílus között:
self.settingsPanel.mariadbPasswordText.SetWindowStyle(wx.NORMAL)
self.settingsPanel.mariadbPasswordText.SetWindowStyle(wx.TE_PASSWORD)
===== ToggleButton =====
Állapot lekérdezése:
if event.GetEventObject().GetValue():
# amit tenni akarunk
===== Külön osztályba rendezés =====
Nagyobb program esetén célszerű külön osztályba rendezni a programunk
egyes komponenseit.
Ehhez nem kell mást tennünk, mint a vizuális szerkesztőben, a "Properties"
ablakban, kikeressük a "**Class**" mezőt. Legyen például egy
panel, ekkor ezen a helyen ezt látjuk: wxPanel. Ezt írjuk át arra a névre,
amit szeretnénk látni.
A "Tree" ablakban pedig válasszuk ki az "Application" gyökércsomópontot,
majd a "Properties" ablakban, keressük meg a "**Separate file for each class**"
rádiógombot.
A "Properties" ablakban, az **Output path** mezőbe ilyenkor egy könyvtár
legyen beállítva, fájl helyett. A könyvtárnak léteznie kell.
Az indítandó fájl ilyenkor az app.py.
A lépések sorra:
- Tree > Kivánt komopens
- Properties > Common > Class: Sajtnev
- Tree > Application
- Properties > (o) Separate file for each class
- Properties > Output path: ./src
Ezek után, ha kódot generálunk, akkor külön állományokba fog minden
osztályt tenni, aminek a nevét átírtunk.
Megjegyzés: Ha MVC-vel dolgozunk, akkor ./src/views könyvtárat állítsunk be,
vagy mentsük az src/views könyvtárba a wxGlade fájlt.
A program mindig a wx.App osztályból származtatott objektummal indul.
Alapesetben, ez egy app.py nevű fájlban található.
Ha egy kontroller fájlból magunk szeretnénk indítani az alkalmazást, a
következőket tegyük:
* Jelöljük ki az "Application" a fanézetben.
* A "Properties" ablakban, "Application" fül.
* Vegyük ki a pipát a Name és Class feliratok mellett:
* Name [ ]
* Class [ ]
===== Git =====
Nézzük meg mit érdemes a .gitignore fájlba írni a wxGlade és a PyCharm
használata mellett.
Legyen egy példa könyvtárszerkezet:
projekt01/
|--.git/
|--.idea/
|--src/
|--.gitignore
`--program.wxg
Lehetséges .git ignore fájl:
.idea/
*~
__pycache__/
===== Amire ügyelni kell =====
==== Függvény és objektumnév egyezés ====
Ha van egy nyomógombunk aminek a neve calcButton,
nem lehet ugyanezen a néven az eseménykezelő metódus.
A wxGlade ezt nem ellenőrzi.
Használjuk eseménykezelőnek ilyenkor például:
OnClickCalcButton
Vagy Python elnevezési konvencióval:
on_click_calc_button
Ilyen esetben az előnézet kérése, hibába ütközik.
A részletes nézetben, megmutatja a hibát.
==== Eseménykezelő függvény átnevezése ====
Ha átnevezzük az eseménykezelőt wxGlade felületen, akkor
létrejön egy új függvény az újonnan beállított néven,
de a régi függvény is megmarad.
==== wxStaticText igazítása wxGlade 0.9.x-ben ====
A Widget fülön ha beállítunk bármit, a szöveg
balra igazítva marad, nem követi a beállítást.
A beállítás azonban működik. Ha előnézetet nézünk, akkor ott látszik.
===== Linkek =====
* Dokumentáció:
* http://wxglade.sourceforge.net/docs/index.html (2020)