[[:oktatas:programozás:python:wxPython_gui|< wxPython]]
====== wxPython nyelv ======
* **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
===== A wxPythonról =====
A wxPython egy több platformos **GUI programozói könyvtár** készlet,
amelyet Python nyelven programozhatunk. A wxPython segítségével
valódi natív alkalmazások hozhatok létre, amelyek kis változtatás,
vagy változtatás nélkül használhatók Windows, macOS és Linux
rendszeren.
Ennek a dokumentumnak az írásánál a wxPython stabil kiadása,
4.1.0.
A wxPython modulok a C++ nyelven írt, wxWidgets keresztplatformos,
nyílt forráskódú programozói könyvtárból származnak.
A wxPython a wxWidgets-hez hasonlóan nyílt forráskódú, ami azt
jelenti hogy bárki számára szabadon használható, módosítható.
Mivel a programozási nyelv Python, a wxPython programok
könnyen írhatók és könnyen érthetőek.
A **Phoenix**, a wxPython az alapoktól kezdve újraírt változata,
azzal a szándékkal, hogy jobb és gyorsabb legyen mint korábban.
A Phoenix-ből eltávolítása kerültek felesleges részek, karbantarthatóbb,
bővíthetőbb lett. A Phoenix még fejlesztés alatt áll, aki
használja, úgynevezett pillanatképet használ a megvalósításból.
Néhány átszervezés, tisztítás és egyszerűsítés miatt a
wxPython és a Phoenix nem teljesen kompatibilis egymással,
szándékosan. A különbségek azonban, általában csekélyek,
egyes alkalmazások, akár módosítás nélkül is futhatnak.
Néhány helyen az osztályból elérés módját változtatták meg
a Phoenix rendszerben.
===== API =====
* https://docs.wxwidgets.org/ (2020)
===== Helló Világ =====
import wx
program = wx.App(False)
ablak = wx.Frame(None, title='Helló Világ')
ablak.Show(True)
program.MainLoop()
* wx.App(False)
* Új alkalmazást hozunk létre
* A False azt jelenti:
A szabványos kimenet és a szabványos hibakimenet (sys.stdout és sys.stderr) nem lesz átirányítva.
Ha wx.App(True, filename='uzenet.txt') formában használjuk, akkor egy print()
utasítás kimenete az uzenet.txt állomány végéhez fűzödik.
* wx.Frame(None, title='Helló Világ')
* Létrehozunk egy ablakkeretet.
* False: ez a legfelső szintű ablak, nincs szülője.
* title='Helló Világ: ez jelenik meg az ablak címsorában.
* ablak.Show(True):
* Megjelenítjük az ablakot.
* program.MainLoop()
* A program folyamatosan fut
{{:oktatas:programozas:python:wxpython_gui:01_hellovilag_wxpython.png|}}
===== Gomb =====
import wx
app = wx.App()
frame = wx.Frame(None, title='Helló Világ')
button = wx.Button(frame, label="Mehet")
frame.Show(True)
app.MainLoop()
===== Gomb esemény =====
import wx
app = wx.App()
frame = wx.Frame(None, title='Helló Világ')
button = wx.Button(frame, label="Mehet")
def OnClickButton(event):
frame.SetTitle('működik')
button.Bind(wx.EVT_BUTTON, OnClickButton)
frame.Show(True)
app.MainLoop()
Az ablak címsorának megváltoztatása:
frame.SetTitle('működik')
===== Metódusban =====
import wx
def main():
app = wx.App()
frame = wx.Frame(None)
frame.SetSize(wx.Size(800,600))
frame.Center()
frame.SetTitle("Első program")
frame.Show()
app.MainLoop()
main()
* frame.SetSize(wx.Size(800, 600))
* Az ablak mérete: 800x600
* frame.Center()
* Az ablak középen jelenjen meg.
* frame.SetTitle("Első program")
* Az ablak címsorának beállítása
===== Osztály használata =====
A következő programban osztályt használunk az ablak létrehozására.
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
class SimpleApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app = SimpleApp()
app.MainLoop()
A SimplaApp osztályban létrehoztunk egy OnInit() függvényt.
Ez automatikusan végrehajtódik futtatáskor.
===== Nyomógomb =====
A nyomógomb gyakori eszköz a felhasználói események figyelésére.
A Button osztállyal egy gombot teszünk az ablakba.
A gombnak csak a felirata lesz beállítva, ezét kitölti az egész ablakot.
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
button = wx.Button(self, label="Mehet")
class ButtonApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app = ButtonApp()
app.MainLoop()
Nézzük az új sort: button = wx.Button(self, label="Mehet").
* button: Egy button nevű objektumot hozunk létre.
* wx.Button: A Button osztályból hozzuk létre.
* self: A keret a szülő objektum
* label='Mehet': A gomb felirata
{{:oktatas:programozas:python:wxpython_gui:02_nyomogomb.png|}}
===== Osztály és eseménykezelés =====
A nyomógombok a kattintásra való reagálás nélkül nem sokat érnek.
Nézzük, hogyan rendelhetünk egy végrehajtandó függvényt a gombhoz.
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
self.button = wx.Button(self, label="Mehet")
self.button.Bind(wx.EVT_BUTTON, self.OnClickButton)
def OnClickButton(self, event):
self.SetTitle('Működik')
class ButtonApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app = ButtonApp()
app.MainLoop()
Nézzük az új sort: self.button.Bind(wx.EVT_BUTTON, self.OnClickButton).
* self: A kereten elhelyezett gombról van szó
* button: A button objektummal szeretnénk valamit csinálni.
* Bind(): Függvényt rendelünk a button objektumhoz
* wx.EVT_BUTTON: A nyomógomb kattintását figyeljük
* self.OnClickButton: Ezt a függvényt rendeljük a button objektumhoz.
===== Gomb és beviteli mező =====
Ha két eszközt teszünk fel, azok alapértelmezettként egymáson jelennek meg.
Meghatározhatjuk a pozíciójukat a SetPosition() függvénnyel.
A gomb mellett egy beviteli mezőt jelenítünk meg a TextCtrl osztállyal.
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
self.text = wx.TextCtrl(self)
self.text.SetPosition((10, 10))
self.button = wx.Button(self, label="Mehet")
self.button.SetPosition((10, 60))
self.button.Bind(wx.EVT_BUTTON, self.OnClickButton)
def OnClickButton(self, event):
self.text.SetValue("42")
class ButtonApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app = ButtonApp()
app.MainLoop()
A SetPosition() függvénynek egyetlen paramétere van, egy wx.Point típus.
Ez két módon adható meg:
* (10, 10)
* wx.Point(10, 10)
A példában mi az első formát használtuk.
{{:oktatas:programozas:python:wxpython_gui:03_gomb_es_bevitel_fixen.png|}}
===== Méretező =====
A widgetsek elhelyezése a SetPositon() függvénnyel fix elrendezést eredményez.
A méretezők lehetővé tesznek rugalmas, automatikus elrendezést, méretezést.
A programok widgets elemeit célszerű ezekkel meghatározni.
Itt a BoxSizer méretezőt fogjuk használni. Segítségével, két lehetőséget állíthatunk
be. Vagy függőlegesen egymás alá rendezzük a widgets elemeket, vagy vízszintesen,
egymás mellé.
{{:oktatas:programozas:python:wxpython_gui:04_elrendezes1.png|}}
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
self.text = wx.TextCtrl(self)
self.button = wx.Button(self, label="Mehet")
self.button.Bind(wx.EVT_BUTTON, self.OnClickButton)
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(self.text)
vbox.Add(self.button)
self.SetSizer(vbox)
self.Layout()
def OnClickButton(self, event):
self.text.SetValue("42")
class ButtonApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app = ButtonApp()
app.MainLoop()
{{:oktatas:programozas:python:wxpython_gui:05_gomb_es_bevitel_elrendezovel.png|}}
Most változtassuk meg az elrendezést vízszintesre.
{{:oktatas:programozas:python:wxpython_gui:06_elrendezes2.png|}}
Keressük meg a vbox = wx.BoxSizer(wx.VERTICAL) sort, majd cseréljük
a következőre:
vbox = wx.BoxSizer(wx.HORIZONTAL)
Futtassuk a programot, nézzük meg.
{{:oktatas:programozas:python:wxpython_gui:07_gomb_es_bevitel_vizszintesen.png|}}
A méretezőbe több widgets elem is elhelyezhető.
===== Elemek két sorba =====
Az elhelyezett widgets elemek Általában több sorból és oszlopból állnak.
Ebben a példában két sorba helyezünk el elemeket.
{{:oktatas:programozas:python:wxpython_gui:08_elrendezes03.png|}}
Készítünk vbox1 néven egy függőleges méretezőt, és két belső méretezőt,
amelyik vízszintes elrendezést használ. A méretezőket így egymásba ágyazzuk.
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
self.text1 = wx.TextCtrl(self)
self.text2 = wx.TextCtrl(self)
self.button1 = wx.Button(self, label="Egyik")
self.button2 = wx.Button(self, label="Másik")
self.vbox1 = wx.BoxSizer(wx.VERTICAL)
self.hbox1 = wx.BoxSizer(wx.HORIZONTAL)
self.hbox2 = wx.BoxSizer(wx.HORIZONTAL)
self.vbox1.Add(self.hbox1)
self.vbox1.Add(self.hbox2)
self.hbox1.Add(self.text1)
self.hbox1.Add(self.button1)
self.hbox2.Add(self.text2)
self.hbox2.Add(self.button2)
self.SetSizer(self.vbox1)
self.Layout()
def OnClickButton(self, event):
self.text.SetValue("42")
class ButtonApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app = ButtonApp()
app.MainLoop()
{{:oktatas:programozas:python:wxpython_gui:09_ketsoros04.png|}}
===== Plusz egy gomb =====
A harmadik sorba egy újabb gombot szeretnénk elhelyezni.
{{:oktatas:programozas:python:wxpython_gui:10_elrendezes05.png|}}
Az ábrán azt látjuk, hogy nem hoztunk létre újabb vízszintes
méretezőt. Ezt megtehetjük és működni fog. Ha később még több
elemre is számíthatunk a harmadik sorba, akkor viszont érdemes
ezt egy újabb méretezőbe tenni.
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
self.text1 = wx.TextCtrl(self)
self.text2 = wx.TextCtrl(self)
self.button1 = wx.Button(self, label="Egyik")
self.button2 = wx.Button(self, label="Másik")
self.button3 = wx.Button(self, label="Harmadik")
vbox1 = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
vbox1.Add(hbox1)
vbox1.Add(hbox2)
vbox1.Add(self.button3)
hbox1.Add(self.text1)
hbox1.Add(self.button1)
hbox2.Add(self.text2)
hbox2.Add(self.button2)
self.SetSizer(vbox1)
self.Layout()
def OnClickButton(self, event):
self.text.SetValue("42")
class ButtonApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app = ButtonApp()
app.MainLoop()
{{:oktatas:programozas:python:wxpython_gui:11_harmadik_sor.png|}}
===== DoLayout függvény =====
Most, hogy ilyen sok utasításunk van, az elrendezést egy külön függvénybe
rendezzük.
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
self.text1 = wx.TextCtrl(self)
self.text2 = wx.TextCtrl(self)
self.button1 = wx.Button(self, label="Egyik")
self.button2 = wx.Button(self, label="Másik")
self.button3 = wx.Button(self, label="Harmadik")
self.DoLayout()
def DoLayout(self):
vbox1 = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
vbox1.Add(hbox1)
vbox1.Add(hbox2)
vbox1.Add(self.button3)
hbox1.Add(self.text1)
hbox1.Add(self.button1)
hbox2.Add(self.text2)
hbox2.Add(self.button2)
self.SetSizer(vbox1)
self.Layout()
def OnClickButton(self, event):
self.text.SetValue("42")
class ButtonApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app = ButtonApp()
app.MainLoop()
===== Arány =====
Térjünk vissza az egyetlen widget soros programunkhoz.
Szeretnénk, ha két widget kitöltené az ablakban a rendelkezésre álló helyet.
El kell döntenünk, milyen arányban töltse ki a widget a rendelkezésre álló helyet.
Lehet 1:1, 1:2, vagy ami éppen tetszik.
{{:oktatas:programozas:python:wxpython_gui:12_elrendezes06.png|}}
{{:oktatas:programozas:python:wxpython_gui:13_elrendezes07.png|}}
Lehet 0:1 arány is. Ilyenkor a 0 aránnyal rendelkező widget
marad alapértelmezett méretű, a másik widget pedig kitölti a
maradék helyet.
Ehhez ki kell egészítenünk a kódot. A példában, az első elem számára 1,
a második elem számára 2-t állítunk be.
vbox.Add(self.text1, 1)
vbox.Add(self.button1, 2)
Ahogy látjuk, az Add() függvénynek egy második paramétert adtunk meg.
A teljes kód:
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
self.text1 = wx.TextCtrl(self)
self.button1 = wx.Button(self, label="Egyik")
vbox = wx.BoxSizer(wx.HORIZONTAL)
vbox.Add(self.text1, 1)
vbox.Add(self.button1, 2)
self.SetSizer(vbox)
self.Layout()
def OnClickButton(self, event):
self.text.SetValue("42")
class ButtonApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app = ButtonApp()
app.MainLoop()
{{:oktatas:programozas:python:wxpython_gui:14_aranyos.png|}}
===== Arányok két sorral =====
A két sor widgetünk van, az egy sorban lévő beviteli mező és gomb nem töltik ki
a rendelkezésre álló helyet. Az eredmény ilyen:
{{:oktatas:programozas:python:wxpython_gui:14_elrendezes08.png|}}
De ezt szeretnénk:
{{:oktatas:programozas:python:wxpython_gui:16_elrendezes10.png|}}
A kész programablak:
{{:oktatas:programozas:python:wxpython_gui:15_elrendezes09.png|}}
Ez azért van, mert a vbox1 méretezőnek függőleges elrendezése van.
A megoldás, ha a hbox1 és a hbox2 számára megmondjuk, hogy töltse ki a
rendelkezésre álló helyet:
vbox1.Add(hbox1, 0, wx.EXPAND)
vbox1.Add(hbox2, 0, wx.EXPAND)
Az arányokat, mindkét esetben 0 értéken hagyjuk.
Teljes kód:
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
self.text1 = wx.TextCtrl(self)
self.text2 = wx.TextCtrl(self)
self.button1 = wx.Button(self, label="Egyik")
self.button2 = wx.Button(self, label="Másik")
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
vbox.Add(hbox1, 0, wx.EXPAND)
vbox.Add(hbox2, 0, wx.EXPAND)
hbox1.Add(self.text1, 1)
hbox1.Add(self.button1, 2)
hbox2.Add(self.text2, 1)
hbox2.Add(self.button2, 2)
self.SetSizer(vbox)
self.Layout()
def OnClickButton(self, event):
self.text.SetValue("42")
class ButtonApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app = ButtonApp()
app.MainLoop()
A megfelelő eredmény:
{{:oktatas:programozas:python:wxpython_gui:17_elrendezes11.png|}}
===== Widget középre =====
Az előző munkánkhoz felteszünk egy gombot, harmadik sorként,
és szeretnénk középre igazítani.
{{:oktatas:programozas:python:wxpython_gui:18_elrendezes12.png|}}
Ha az wx.EXPAND-ot használnánk, az egészet kitöltené.
Helyette a wx.ALIGN_CENTER_HORIZONTAL állandót használjuk.
vbox.Add(self.button3, 0, wx.ALIGN_CENTER_HORIZONTAL)
A teljes kód:
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
self.text1 = wx.TextCtrl(self)
self.text2 = wx.TextCtrl(self)
self.button1 = wx.Button(self, label="Egyik")
self.button2 = wx.Button(self, label="Másik")
self.button3 = wx.Button(self, label="Másik")
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
vbox.Add(hbox1, 0, wx.EXPAND)
vbox.Add(hbox2, 0, wx.EXPAND)
vbox.Add(self.button3, 0, wx.ALIGN_CENTER_HORIZONTAL)
hbox1.Add(self.text1, 1)
hbox1.Add(self.button1, 2)
hbox2.Add(self.text2, 1)
hbox2.Add(self.button2, 2)
self.SetSizer(vbox)
self.Layout()
def OnClickButton(self, event):
self.text.SetValue("42")
class ButtonApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app = ButtonApp()
app.MainLoop()
Az eredmény:
{{:oktatas:programozas:python:wxpython_gui:19_elrendezes13.png|}}
===== Szegély =====
Szeretnénk 6 pixeles szegélyt minden widget köré.
hbox1.Add(self.text1, 1, wx.ALL, 6)
hbox1.Add(self.button1, 2, wx.ALL, 6)
...
hbox2.Add(self.text2, 1, wx.ALL, 6)
hbox2.Add(self.button2, 2, wx.ALL, 6)
...
vbox.Add(self.button3, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 6)
A button3 objektum esetén már van egy harmadik paraméter, ezért
egy (|) pipe karakterrel elválasztva vezetjük be a wx.ALL
állandót.
A wx.ALL a szegélyre vonatkozik. Azt jelenti minden oldalon.
Lehetséges értékek:
* wx.ALL
* wx.LEFT
* wx.RIGHT
* wx.TOP
* wx.BOTTOM
Természetesen pipe karakterrel tagolva, ezekből is megadható több.
Az Add() függvényünknek lett egy negyedik paraméter is, ami
megmondja hány pixel széles legyen a szegély.
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
self.text1 = wx.TextCtrl(self)
self.text2 = wx.TextCtrl(self)
self.button1 = wx.Button(self, label="Egyik")
self.button2 = wx.Button(self, label="Másik")
self.button3 = wx.Button(self, label="Másik")
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
vbox.Add(hbox1, 0, wx.EXPAND)
vbox.Add(hbox2, 0, wx.EXPAND)
vbox.Add(self.button3, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 6)
hbox1.Add(self.text1, 1, wx.ALL, 6)
hbox1.Add(self.button1, 2, wx.ALL, 6)
hbox2.Add(self.text2, 1, wx.ALL, 6)
hbox2.Add(self.button2, 2, wx.ALL, 6)
self.SetSizer(vbox)
self.Layout()
def OnClickButton(self, event):
self.text.SetValue("42")
class ButtonApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app = ButtonApp()
app.MainLoop()
{{:oktatas:programozas:python:wxpython_gui:20_szegely.png|}}
===== Felirat középre =====
Cseréljük le a gombokat feliratokra, és tegyük azokat baloldalra.
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
self.label1 = wx.StaticText(self, label="Egyik")
self.label2 = wx.StaticText(self, label="Másik")
self.text1 = wx.TextCtrl(self)
self.text2 = wx.TextCtrl(self)
self.button1 = wx.Button(self, label="Mehet")
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
vbox.Add(hbox1, 0, wx.EXPAND)
vbox.Add(hbox2, 0, wx.EXPAND)
vbox.Add(self.button1, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 6)
hbox1.Add(self.label1, 1, wx.ALL, 6)
hbox1.Add(self.text1, 2, wx.ALL, 6)
hbox2.Add(self.label2, 1, wx.ALL, 6)
hbox2.Add(self.text2, 2, wx.ALL, 6)
self.SetSizer(vbox)
self.Layout()
def OnClickButton(self, event):
self.text.SetValue("42")
class ButtonApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app = ButtonApp()
app.MainLoop()
{{:oktatas:programozas:python:wxpython_gui:21_felirat01.png|}}
Látható, hogy a feliratok függőlegesen nincsenek középen a
nyomógombhoz képest.
Az idevonatkozó sorok:
hbox1.Add(self.label1, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 6)
...
hbox2.Add(self.label2, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 6)
A teljes kód:
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
self.label1 = wx.StaticText(self, label="Egyik")
self.label2 = wx.StaticText(self, label="Másik")
self.text1 = wx.TextCtrl(self)
self.text2 = wx.TextCtrl(self)
self.button1 = wx.Button(self, label="Mehet")
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
vbox.Add(hbox1, 0, wx.EXPAND)
vbox.Add(hbox2, 0, wx.EXPAND)
vbox.Add(self.button1, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 6)
hbox1.Add(self.label1, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 6)
hbox1.Add(self.text1, 2, wx.ALL, 6)
hbox2.Add(self.label2, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 6)
hbox2.Add(self.text2, 2, wx.ALL, 6)
self.SetSizer(vbox)
self.Layout()
def OnClickButton(self, event):
self.text.SetValue("42")
class ButtonApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app = ButtonApp()
app.MainLoop()
{{:oktatas:programozas:python:wxpython_gui:22_felirat02.png|}}
===== TextCtrl felirat jobbra =====
Szeretnénk a widgeten belül jobbra igazítani a szöveget.
Ehhez a style=wx.ALIGN_RIGH beállítást használjuk.
self.label1 = wx.StaticText(self, label="Egyik", style=wx.ALIGN_RIGHT)
self.label2 = wx.StaticText(self, label="Másik", style=wx.ALIGN_RIGHT)
A teljes kód:
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
self.label1 = wx.StaticText(self, label="Egyik", style=wx.ALIGN_RIGHT)
self.label2 = wx.StaticText(self, label="Másik", style=wx.ALIGN_RIGHT)
self.text1 = wx.TextCtrl(self)
self.text2 = wx.TextCtrl(self)
self.button1 = wx.Button(self, label="Mehet")
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
vbox.Add(hbox1, 0, wx.EXPAND)
vbox.Add(hbox2, 0, wx.EXPAND)
vbox.Add(self.button1, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 6)
hbox1.Add(self.label1, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 6)
hbox1.Add(self.text1, 2, wx.ALL, 6)
hbox2.Add(self.label2, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 6)
hbox2.Add(self.text2, 2, wx.ALL, 6)
self.SetSizer(vbox)
self.Layout()
def OnClickButton(self, event):
self.text.SetValue("42")
class ButtonApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app = ButtonApp()
app.MainLoop()
{{:oktatas:programozas:python:wxpython_gui:23_felirat03.png|}}
===== Helykitöltő =====
A beviteli mezőktől jobbra nem ártana több hely.
Ezt helykitöltővel érjük el:
hbox1.Add((20, 20), 1)
...
hbox2.Add((20, 20), 1)
A teljes kód:
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super(MainFrame, self).__init__(parent)
self.label1 = wx.StaticText(self, label="Egyik", style=wx.ALIGN_RIGHT)
self.label2 = wx.StaticText(self, label="Másik", style=wx.ALIGN_RIGHT)
self.text1 = wx.TextCtrl(self)
self.text2 = wx.TextCtrl(self)
self.button1 = wx.Button(self, label="Mehet")
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
vbox.Add(hbox1, 0, wx.EXPAND)
vbox.Add(hbox2, 0, wx.EXPAND)
vbox.Add(self.button1, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 6)
hbox1.Add(self.label1, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 6)
hbox1.Add(self.text1, 2, wx.ALL, 6)
hbox1.Add((20, 20), 1)
hbox2.Add(self.label2, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 6)
hbox2.Add(self.text2, 2, wx.ALL, 6)
hbox2.Add((20, 20), 1)
self.SetSizer(vbox)
self.Layout()
def OnClickButton(self, event):
self.text.SetValue("42")
class ButtonApp(wx.App):
def OnInit(self):
frame = MainFrame(None)
frame.Show()
return True
app = ButtonApp()
app.MainLoop()
{{:oktatas:programozas:python:wxpython_gui:24_helykitolto.png|}}
===== Kurzor =====
#!/usr/bin/python
#coding: utf-8
import wx
app = wx.App()
frame = wx.Frame(None)
frame.SetSize(wx.Size(800,600))
frame.SetCursor(wx.StockCursor(wx.CURSOR_MAGNIFIER))
frame.SetPosition(wx.Point(0,0))
frame.SetTitle("Első program")
frame.Show()
app.MainLoop()
===== Külső Linkek =====
* http://wiki.wxpython.org
* http://wiki.wxpython.org/Getting%20Started
* http://wiki.wxpython.org/How%20to%20Learn%20wxPython
* https://wiki.wxpython.org/wxPython%20by%20Example
Phoenix:
* https://github.com/wxWidgets/Phoenix (2020)
* https://pythonhosted.org/wxPython/ (2020)
* https://wxpython.org/Phoenix/snapshot-builds/ (2020, pillanatképek)