wxPython - Hızlı Kılavuz
wxPython için bir Python sarmalayıcıdır wxWidgets(C ++ ile yazılmıştır), popüler bir çapraz platform GUI araç takımı. Robin Dunn tarafından Harri Pasanen ile birlikte geliştirilen wxPython, bir Python genişletme modülü olarak uygulanmaktadır.
WxWidgets gibi, wxPython da ücretsiz bir yazılımdır. Resmi web sitesinden indirilebilirhttp://wxpython.org. Birçok işletim sistemi platformu için ikili dosyalar ve kaynak kodu bu sitede indirilebilir.
WxPython API'deki ana modüller bir çekirdek modül içerir. Bu oluşmaktadırwxObjectAPI'deki tüm sınıflar için temel olan class. Kontrol modülü, GUI uygulama geliştirmede kullanılan tüm widget'ları içerir. Örneğin, wx.Button, wx.StaticText (bir etikete benzer), wx.TextCtrl (düzenlenebilir metin kontrolü) vb.
wxPython API, GDI (Grafik Aygıt Arabirimi) modülüne sahiptir. Widget'lara çizim yapmak için kullanılan bir sınıf kümesidir. Yazı tipi, renk, fırça vb. Sınıflar bunun bir parçasıdır. Tüm konteyner pencere sınıfları Windows modülünde tanımlanmıştır.
WxPython'un resmi web sitesi, Python 3 için yeni bir wxPython uygulaması olan Project Phoenix'i de barındırıyor. *. Hız, sürdürülebilirlik ve genişletilebilirliği iyileştirmeye odaklanır. Proje 2012'de başladı ve halen beta aşamasında.
pencereler
Windows işletim sistemi için önceden oluşturulmuş ikili dosyalar (hem 32 bit hem de 64 bit) şu cihazlarda mevcuttur: http://www.wxpython.org/download.phpsayfa. Mevcut montajcılar son sürümleri şunlardır - wxPython3.0-win32-3.0.2.0-py27.exe 32 bit Python 2.7 için wxPython3.0-win64-3.0.2.0-py27.exe Python 2.7 64-bit
wxPython demosu, örnekler ve wxWidgets belgeleri de aynı sayfada indirilebilir.
wxPython3.0-win32-docs-demos.exe
Linux
Birçok Linux dağıtımı için wxPython ikili dosyaları, ilgili depolarında bulunabilir. İndirmek ve kurmak için ilgili paket yöneticilerinin kullanılması gerekecektir. Örneğin Debian Linux'ta, aşağıdaki komut wxPython'u yükleyebilmelidir.
sudo apt-get install python-wxgtk3.0
Mac os işletim sistemi
MacOS için önceden oluşturulmuş ikili dosyalar, resmi web sitesinin indirme sayfasında mevcuttur.
Hello World mesajını görüntüleyen basit bir GUI uygulaması, aşağıdaki adımlar kullanılarak oluşturulmuştur -
Wx modülünü içe aktarın.
Application sınıfının bir nesnesini tanımlayın.
Wx.Frame sınıfının nesnesi olarak bir üst seviye pencere oluşturun. Yapılandırıcıda başlık ve boyut parametreleri verilmiştir.
Frame nesnesine başka kontroller eklenebilse de, bunların yerleşimi yönetilemez. Bu nedenle, Çerçeveye bir Panel nesnesi yerleştirin.
Pencerenin içinde istenen bir konumda 'Merhaba Dünya'yı görüntülemek için bir StaticText nesnesi ekleyin.
Çerçeve penceresini show () yöntemiyle etkinleştirin.
Uygulama nesnesinin ana olay döngüsünü girin.
import wx
app = wx.App()
window = wx.Frame(None, title = "wxPython Frame", size = (300,200))
panel = wx.Panel(window)
label = wx.StaticText(panel, label = "Hello World", pos = (100,50))
window.Show(True)
app.MainLoop()
Yukarıdaki kod aşağıdaki çıktıyı üretir -
wxFrame objecten yaygın kullanılan üst düzey penceredir. TüretilmiştirwxWindow class. Çerçeve, boyutu ve konumu kullanıcı tarafından değiştirilebilen bir penceredir. Bir başlık çubuğu ve kontrol düğmeleri vardır. Gerekirse menü çubuğu, araç çubuğu ve durum çubuğu gibi diğer bileşenler etkinleştirilebilir. Bir wxFrame penceresi, iletişim kutusu olmayan herhangi bir çerçeve veya başka bir çerçeve içerebilir.
Manuel kodlama ile iyi görünümlü bir GUI oluşturmak sıkıcı olabilir. Görsel bir GUI tasarım aracı her zaman kullanışlıdır. WxPython'u hedefleyen birçok GUI geliştirme IDE'si mevcuttur. Bunlardan bazıları aşağıdadır -
- wxFormBuilder
- wxDesigner
- wxGlade
- BoaConstructor
- gui2py
wxFormBuilderwxWidget GUI tasarımını C ++, Python, PHP veya XML formatına çevirebilen açık kaynaklı, çapraz platformlu bir WYSIWYG GUI oluşturucusudur. WxFormBuilder'ın kullanımına kısa bir giriş burada verilmiştir.
Öncelikle wxFormBuilder'ın en son sürümünün şuradan indirilmesi ve kurulması gerekir: http://sourceforge.net/projects/wxformbuilder/. Uygulama açıldığında, ortasında boş gri alan olan yeni bir proje belirir.
Projeye uygun bir isim verin ve kod üretme dili olarak Python'u seçin. Bu, aşağıdaki resimde gösterildiği gibi Nesne özellikleri penceresinde yapılır -
Ardından, bileşenler paletinin 'Formlar' sekmesinden Çerçeve'yi seçin.
'Düzenler' sekmesinden dikey bir wxBoxSizer ekleyin.
Kutuya uygun başlıklar ile gerekli kontrolleri ekleyin. Burada, bir StaticText (etiket), iki TextCtrl nesnesi (metin kutuları) ve bir wxButton nesnesi eklenir. Çerçeve aşağıdaki resme benziyor -
Bu üç denetimde Genişletme ve Uzatma'yı etkinleştirin. WxButton nesnesinin nesne özelliklerinde, OnButtonClick olayına findquare () işlevi atayın.
Projeyi kaydedin ve geliştirilen GUI için Python kodu oluşturmak üzere F8 tuşuna basın. Oluşturulan dosyanın Demo.py olarak adlandırılmasına izin verin
Çalıştırılabilir Python betiğinde, demo.py'yi içe aktarın ve FindSquare () işlevini tanımlayın. Uygulama nesnesini bildirin ve bir ana olay döngüsü başlatın. Çalıştırılabilir kod aşağıdadır -
import wx
#import the newly created GUI file
import demo
class CalcFrame(demo.MyFrame1):
def __init__(self,parent):
demo.MyFrame1.__init__(self,parent)
def FindSquare(self,event):
num = int(self.m_textCtrl1.GetValue())
self.m_textCtrl2.SetValue (str(num*num))
app = wx.App(False)
frame = CalcFrame(None)
frame.Show(True)
#start the applications
app.MainLoop()
Yukarıdaki kod aşağıdaki çıktıyı üretir -
Orijinal wxWidgets (C ++ ile yazılmış) çok büyük bir sınıf kitaplığıdır. Bu kitaplıktaki GUI sınıfları, orijinal wxWidgets kitaplığını olabildiğince yakın yansıtmaya çalışan wxPython modülü ile Python'a taşınır. Dolayısıyla, wxPython'daki wx.Frame sınıfı, C ++ sürümündeki wxFrame sınıfıyla aynı şekilde davranır.
wxObject, sınıfların çoğu için temeldir. Bir wxApp nesnesi (wxPython'da wx.App) uygulamanın kendisini temsil eder. GUI oluşturulduktan sonra, uygulama MainLoop () yöntemi ile bir olay döngüsüne girer. Aşağıdaki diyagramlar, wxPython'da bulunan en yaygın kullanılan GUI sınıflarının sınıf hiyerarşisini göstermektedir.
SN | Sınıflar ve Açıklama |
---|---|
1 | wx.Frame wx.Frame Sınıfı, bağımsız değişken içermeyen varsayılan bir kurucuya sahiptir. |
2 | wx.Panel wx.Panel sınıfı genellikle bir wxFrame nesnesinin içine yerleştirilir. Bu sınıf ayrıca wxWindow sınıfından miras alınır. |
3 | wx.StaticText wx.StaticText sınıf nesnesi, bu tür salt okunur metni tutan bir denetim sunar. Herhangi bir olay meydana getirmediği için pasif kontrol olarak adlandırılabilir. |
4 | TextCtrl WxPython'da, wx.TextCtrl sınıfının bir nesnesi bu amaca hizmet eder. Metnin görüntülenebileceği ve düzenlenebileceği bir kontroldür. |
5 | RadioButton ve RadioBox Her düğme, wx.RadioButton sınıfının bir nesnesi, yuvarlak bir düğmenin yanında bir metin etiketi taşır. wxPython API ayrıca wx.RadioBox sınıfından oluşur. Nesnesi, gruba bir sınır ve etiket sunar. |
6 | wx.CheckBox Bir onay kutusu, küçük etiketli bir dikdörtgen kutu görüntüler. Tıklandığında, bir seçimin yapıldığını belirtmek için dikdörtgenin içinde bir onay işareti belirir. |
7 | ComboBox ve Seçim Sınıfı Bir wx.ComboBox nesnesi, aralarından seçim yapabileceğiniz bir öğe listesi sunar. Açılır liste veya kalıcı ekran olacak şekilde yapılandırılabilir. wxPython API, nesnesi aynı zamanda kalıcı olarak salt okunur olan bir açılır liste olan bir wx.Choice sınıfı içerir. |
8 | Wx.Gauge Wx.Gauge sınıfı nesnesi, artan miktarı grafiksel olarak gösteren dikey veya yatay bir çubuk gösterir. |
9 | wx. kaydırıcı wxPython API, wx.Slider sınıfını içerir. Scrollbar ile aynı işlevselliği sunar. Slider, tutamacı kaydırıcıya özgü wx.EVT_SLIDER olay bağlayıcıyla sürüklemeyi işlemek için uygun bir yol sunar. |
10 | wx.MenuBar Üst düzey bir pencerenin başlık çubuğunun hemen altındaki yatay bir çubuk, bir dizi menüyü görüntülemek için ayrılmıştır. WxPython API'de wx.MenuBar sınıfının bir nesnesidir. |
11 | wx.Toolbar Wx.Toolbar nesnesinin stil parametresi wx.TB_DOCKABLE olarak ayarlanırsa, yerleştirilebilir hale gelir. WxPython'un AUIToolBar sınıfı kullanılarak yüzen bir araç çubuğu da oluşturulabilir. |
12 | Wx.Dialog Bir Dialog sınıfı nesnesi bir Çerçeve gibi görünse de, normalde bir üst çerçevenin üstünde bir açılır pencere olarak kullanılır. Bir Diyalogun amacı, kullanıcıdan bazı verileri toplamak ve bunları ana çerçeveye göndermektir. |
13 | wx.Notebook wx.Notebook widget'ı sekmeli bir denetim sunar. Çerçevedeki bir Defter nesnesi, her biri kontrollerin düzenini gösteren bir panele sahip olan bir veya daha fazla sekmeye (Sayfalar adı verilir) sahiptir. |
14 | wx.SplitterWindow Bu sınıfın amacı, boyutları dinamik olarak aralarındaki sınırlar sürüklenerek değiştirilebilen iki alt pencereyi tutan bir yerleşim yöneticisidir. Bölücü kontrolü, kontrolleri yeniden boyutlandırmak için sürüklenebilen bir tutamaç sağlar. |
15 | HTMLWindow wxHTML kitaplığı, HTML içeriğini ayrıştırmak ve görüntülemek için sınıflar içerir. Bunun tam özellikli bir tarayıcı olması amaçlanmasa da, wx.HtmlWindow nesnesi genel bir HTML görüntüleyicidir. |
16 | ListBox ve ListCtrl Bir wx.ListBox widget'ı, dikey olarak kaydırılabilir bir dizge listesi sunar. Varsayılan olarak, listedeki tek bir öğe seçilebilir. ListCtrl widget'ı, oldukça gelişmiş bir liste görüntüleme ve seçim aracıdır. Rapor görünümünde, Liste görünümünde veya Simge görünümünde birden fazla sütunun listesi görüntülenebilir. |
Sıralı bir şekilde yürütülen bir konsol modu uygulamasının aksine, GUI tabanlı bir uygulama olay güdümlüdür. İşlevler veya yöntemler, kullanıcının bir düğmeyi tıklatma, koleksiyondan bir öğeyi seçme veya fare tıklaması vb. Gibi olaylara yanıt olarak yürütülür.
Uygulamanın çalışma zamanı sırasında meydana gelen bir olayla ilgili veriler, aşağıdakilerden türetilen bir alt sınıfın nesnesi olarak saklanır. wx.Event. Bir görüntüleme denetimi (Button gibi), belirli bir türdeki olayın kaynağıdır ve kendisiyle ilişkilendirilmiş Event sınıfının bir nesnesini üretir. Örneğin, bir düğmenin tıklanması bir wx.CommandEvent yayınlar. Bu olay verileri, programdaki olay işleyici yöntemine gönderilir. wxPython'da önceden tanımlanmış birçok olay bağlayıcı vardır. BirEvent binder belirli bir pencere öğesi (kontrol), ilişkili olay türü ve olay işleyici yöntemi arasındaki ilişkiyi kapsüller.
Örneğin, aramak için OnClick() method programın bir düğmenin tıklama olayında yer alması durumunda, aşağıdaki ifade gereklidir -
self.b1.Bind(EVT_BUTTON, OnClick)
Bind() methodwx.EvtHandler sınıfındaki tüm görüntüleme nesneleri tarafından miras alınır. EVT_.BUTTON burada, düğme tıklama olayını OnClick () yöntemiyle ilişkilendiren bağlayıcıdır.
Misal
Aşağıdaki örnekte, üst düzey pencerenin (bu durumda bir wx.Frame nesnesi) sürüklenmesinin neden olduğu MoveEvent, OnMove() methodwx.EVT_MOVE bağlayıcı kullanarak. Kod bir pencere görüntüler. Fare kullanılarak hareket ettirilirse, anlık koordinatları konsolda görüntülenir.
import wx
class Example(wx.Frame):
def __init__(self, *args, **kw):
super(Example, self).__init__(*args, **kw)
self.InitUI()
def InitUI(self):
self.Bind(wx.EVT_MOVE, self.OnMove)
self.SetSize((250, 180))
self.SetTitle('Move event')
self.Centre()
self.Show(True)
def OnMove(self, e):
x, y = e.GetPosition()
print "current window position x = ",x," y= ",y
ex = wx.App()
Example(None)
ex.MainLoop()
Yukarıdaki kod aşağıdaki çıktıyı üretir -
geçerli pencere konumu x = 562 y = 309
geçerli pencere konumu x = 562 y = 309
geçerli pencere konumu x = 326 y = 304
geçerli pencere konumu x = 384 y = 240
geçerli pencere konumu x = 173 y = 408
geçerli pencere konumu x = 226 y = 30
geçerli pencere konumu x = 481 y = 80
Wx.Event'ten miras alınan bazı alt sınıflar aşağıdaki tabloda listelenmiştir -
SN | Olaylar ve Açıklama |
---|---|
1 | wxKeyEvent Bir tuşa basıldığında veya bırakıldığında oluşur |
2 | wxPaintEvent Pencerenin içeriğinin yeniden çizilmesi gerektiğinde oluşturulur |
3 | wxMouseEvent Fare düğmesine basılması veya sürüklenmesi gibi fare faaliyetlerinden kaynaklanan herhangi bir olay hakkında veri içerir |
4 | wxScrollEvent WxScrollbar ve wxSlider gibi kaydırılabilir kontrollerle ilişkilendirilmiştir |
5 | wxCommandEvent Düğme, diyaloglar, pano vb. Gibi birçok widget'tan gelen olay verilerini içerir. |
6 | wxMenuEvent Menü komut düğmesi tıklaması hariç farklı menü ile ilgili olaylar |
7 | wxColourPickerEvent wxColourPickerCtrl olayları oluşturdu |
8 | wxDirFilePickerEvent FileDialog ve DirDialog tarafından oluşturulan etkinlikler |
WxPython'daki olaylar iki türdendir. Temel olaylar ve Komut olayları. Temel bir olay, ortaya çıktığı pencerede yerel olarak kalır. WxWidget'ların çoğu komut olayları oluşturur. Bircommand event sınıf hiyerarşisinde kaynak pencerenin üzerinde olan pencere veya pencerelere yayılabilir.
Misal
Aşağıda, olay yayılmasının basit bir örneği verilmiştir. Tam kod -
import wx
class MyPanel(wx.Panel):
def __init__(self, parent):
super(MyPanel, self).__init__(parent)
b = wx.Button(self, label = 'Btn', pos = (100,100))
b.Bind(wx.EVT_BUTTON, self.btnclk)
self.Bind(wx.EVT_BUTTON, self.OnButtonClicked)
def OnButtonClicked(self, e):
print 'Panel received click event. propagated to Frame class'
e.Skip()
def btnclk(self,e):
print "Button received click event. propagated to Panel class"
e.Skip()
class Example(wx.Frame):
def __init__(self,parent):
super(Example, self).__init__(parent)
self.InitUI()
def InitUI(self):
mpnl = MyPanel(self)
self.Bind(wx.EVT_BUTTON, self.OnButtonClicked)
self.SetTitle('Event propagation demo')
self.Centre()
self.Show(True)
def OnButtonClicked(self, e):
print 'click event received by frame class'
e.Skip()
ex = wx.App()
Example(None)
ex.MainLoop()
Yukarıdaki kodda iki sınıf vardır. MyPanel, bir wx.Panel alt sınıfı ve Örnek, program için en üst düzey pencere olan bir wx.Frame alt sınıfı. Panele bir düğme yerleştirilir.
Bu Button nesnesi, onu üst sınıfa (bu durumda MyPanel) yayan bir olay işleyicisine btnclk () bağlıdır. Düğme tıklaması birCommandEvent bu, Skip () yöntemiyle üstüne yayılabilir.
MyPanel sınıf nesnesi ayrıca alınan olayı başka bir işleyici OnButtonClicked () 'e bağlar. Bu işlev sırayla kendi ebeveynine, Example sınıfına iletir. Yukarıdaki kod aşağıdaki çıktıyı üretir -
Button received click event. Propagated to Panel class.
Panel received click event. Propagated to Frame class.
Click event received by frame class.
Bir GUI pencere öğesi, piksel cinsinden ölçülen mutlak koordinatları belirtilerek konteyner penceresinin içine yerleştirilebilir. Koordinatlar, yapıcısının boyut bağımsız değişkeni tarafından tanımlanan pencerenin boyutlarına göredir. Pencere içindeki pencere aracının konumu şu şekilde tanımlanır:pos yapıcısının argümanı.
import wx
app = wx.App()
window = wx.Frame(None, title = "wxPython Frame", size = (300,200))
panel = wx.Panel(window)
label = wx.StaticText(panel, label = "Hello World", pos = (100,50))
window.Show(True)
app.MainLoop()
Bu Absolute Positioning ancak aşağıdaki nedenlerden dolayı uygun değildir -
Pencere yeniden boyutlandırılsa bile widget'ın konumu değişmez.
Farklı çözünürlüklere sahip farklı görüntüleme cihazlarında görünüm tek tip olmayabilir.
Tüm formun yeniden tasarlanması gerekebileceğinden mizanpajda değişiklik yapmak zordur.
wxPython API, konteyner içindeki widget'ların daha zarif bir şekilde konumlandırılması için Layout sınıfları sağlar. Layout yöneticilerinin mutlak konumlandırmaya göre avantajları şunlardır:
- Pencerenin içindeki widget'lar otomatik olarak yeniden boyutlandırılır.
- Farklı çözünürlüklere sahip ekran cihazlarında tek tip görünüm sağlar.
- Yeniden tasarlamaya gerek kalmadan dinamik olarak widget eklemek veya kaldırmak mümkündür.
Düzen yöneticisine wxPython'da Sizer denir. Wx.Sizer, tüm boyutlandırma alt sınıfları için temel sınıftır. Wx.BoxSizer, wx.StaticBoxSizer, wx.GridSizer, wx.FlexGridSizer ve wx.GridBagSizer gibi bazı önemli boyutlandırıcılardan bahsedelim.
SN | Boyutlandırıcılar ve Açıklama |
---|---|
1 | BoxSizer Bu boyutlandırıcı, kontrollerin sıra veya sütun şeklinde düzenlenmesine izin verir. BoxSizer'ın düzeni, yönelim argümanına göre belirlenir (wxVERTICAL veya wxHORIZONTAL). |
2 | GridSizer Adından da anlaşılacağı gibi, GridSizer nesnesi iki boyutlu bir ızgara sunar. Kontroller, ızgara yuvasına soldan sağa ve yukarıdan aşağıya sırayla eklenir. |
3 | FlexiGridSizer Bu boyutlandırıcının ayrıca iki boyutlu bir ızgarası vardır. Bununla birlikte, hücrelerdeki kontrollerin yerleştirilmesinde biraz daha fazla esneklik sağlar. |
4 | GridBagSizer GridBagSizer çok yönlü bir boyutlandırıcıdır. FlexiGridSizer'dan daha fazla geliştirme sunar. Alt pencere öğesi, ızgara içindeki belirli bir hücreye eklenebilir. |
5 | StaticBoxSizer StaticBoxSizer, statik bir kutuya bir kutu boyutlandırıcı koyar. Üstte bir etiket ile birlikte kutunun etrafında bir sınır sağlar. |
Düğme widget'ı en yaygın olarak herhangi bir GUI arayüzünde kullanılır. Kullanıcı tarafından oluşturulan tıklama olayını yakalar. En belirgin kullanımı, kendisine bağlı bir işleyici işlevini tetiklemektir.
wxPython sınıf kitaplığı, farklı türde düğmeler sağlar. Basit, geleneksel bir düğme var,wx.Buttonresim yazısı olarak bir miktar metin taşıyan sınıf nesnesi. Ayrıca iki durumlu bir düğme de mevcuttur.wx.ToggleButton. Basılmış veya basılmış durumu, çift taşıyıcı işlevi ile tanımlanabilir.
Başka bir düğme türü, wx.BitmapButton yüzünde simge olarak bir bitmap (resim) görüntüler.
Wx.Button sınıfı ve wx.ToggleButton sınıfı için oluşturucu aşağıdaki bağımsız değişkenleri alır -
Wx.Button(parent, id, label, pos, size, style)
Bunlar wx.Button sınıfının bazı önemli yöntemleridir -
SN | Yöntemler ve Açıklama |
---|---|
1 | SetLabel() Düğmenin başlığını programlı olarak ayarlar |
2 | GetLabel() Düğmenin başlığını verir |
3 | SetDefault() Düğme, üst düzey pencere için varsayılan olarak ayarlanmıştır. Enter tuşuna basıldığında tıklama olayını taklit eder |
Wx.ToggleButton sınıfının iki önemli yöntemi -
SN | Yöntemler ve Açıklama |
---|---|
1 | GetValue() Geçiş düğmesinin durumunu döndürür (açık / kapalı) |
2 | SetValue() Programlı olarak düğmenin durumunu ayarlar |
Bir bitmap düğmesi oluşturmak için, öncelikle bir görüntü dosyasından bir bitmap nesnesinin oluşturulması gerekir.
Aşağıdaki wx.Bitmap sınıfı yapıcısı varyasyonu en yaygın olarak kullanılır -
Wx.Bitmap(fiiename, wx.BITMAP_TYPE)
Önceden tanımlanmış bitmap türü sabitlerinden bazıları -
wx.BITMAP_TYPE_BMP |
wx.BITMAP_TYPE_ICO |
wx.BITMAP_TYPE_CUR |
wx.BITMAP_TYPE_TIFF |
wx.BITMAP_TYPE_TIF |
wx.BITMAP_TYPE_GIF |
wx.BITMAP_TYPE_PNG |
wx.BITMAP_TYPE_JPEG |
wx.BITMAP_TYPE_PCX |
wx.BITMAP_TYPE_ICON |
wx.BITMAP_TYPE_ANY |
Bu bitmap nesnesi, wx.BitmapButton sınıfı yapıcısı için parametrelerden biri olarak kullanılır.
Wx.BitmapButton(parent, id, bitmap, pos, size, style)
Bazı işletim sistemi platformlarında, bitmap düğmesi hem bitmap'i hem de etiketi görüntüleyebilir. SetLabel () yöntemleri resim yazısını atar. Diğer platformlarda, dahili bir etiket görevi görür.
Normal düğme ve bitmap düğmesi bir wx.CommandEvent yayar. EVT_BUTTON bağlayıcı, kendisine bir işleyici işlevi ilişkilendirir.
Öte yandan geçiş düğmesi, olay işleme için wx.TOGGLEBUTTON bağlayıcısını kullanır.
Aşağıdaki örnekte, her üç türdeki düğmeler, bir panelin dikey bir kutu boyutlandırıcısına yerleştirilmiştir.
Basit düğme nesnesi, ifade kullanılarak oluşturulur -
self.btn = wx.Button(panel, -1, "click Me")
Geçiş düğmesi aşağıdaki ifade ile oluşturulur -
self.tbtn = wx.ToggleButton(panel , -1, "click to on")
Bu düğmeler, aşağıdaki ifadeler kullanılarak dikey boyutlandırıcıya eklenir -
vbox.Add(self.btn,0,wx.ALIGN_CENTER)
vbox.Add(self.tbtn,0,wx.EXPAND|wx.ALIGN_CENTER)
Note - wx.EXPAND bayrağı nedeniyle, geçiş düğmesi çerçevenin tüm genişliğini kaplar.
EVT_BUTTON ve EVT_TOGGLEBUTTON bağlayıcılarını kullanarak, bunlar ilgili işleyicilerle ilişkilendirilir.
self.btn.Bind(wx.EVT_BUTTON,self.OnClicked)
self.tbtn.Bind(wx.EVT_TOGGLEBUTTON,self.OnToggle)
Yatay kutu boyutlandırıcıya üç bitmap düğmesi eklenir. Bu düğmeler, bir resmi başlık olarak simge olarak görüntüler.
bmp = wx.Bitmap("NEW.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
bmp1 = wx.Bitmap("OPEN.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn1 = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp1,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
bmp2 = wx.Bitmap("SAVE.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn2 = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp2,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
Bu üç düğmenin tıklama olayı OnClicked () yöntemine yönlendirilir.
self.bmpbtn.Bind(wx.EVT_BUTTON, self.OnClicked)
self.bmpbtn1.Bind(wx.EVT_BUTTON, self.OnClicked)
self.bmpbtn2.Bind(wx.EVT_BUTTON, self.OnClicked)
Bu düğmelerin dahili etiketleri sırasıyla YENİ, AÇIK ve KAYDET olarak ayarlanmıştır.
OnClicked () olay işleyici işlevi, click olayına neden olan kaynak düğmesinin etiketini alır. Bu etiket konsolun üzerine basılmıştır.
def OnClicked(self, event):
btn = event.GetEventObject().GetLabel()
print "Label of pressed button = ",btn
OnToggle () olay işleyicisi, geçiş düğmesi tıklandığında tetiklenir. Durumu GetValue () yöntemi ile okunur ve buna göre düğmenin başlığı ayarlanır.
def OnToggle(self,event):
state = event.GetEventObject().GetValue()
if state == True:
print "off"
event.GetEventObject().SetLabel("click to off")
else:
print "on"
event.GetEventObject().SetLabel("click to on")
Tam kod listesi aşağıdaki gibidir -
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (200,150))
panel = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
self.btn = wx.Button(panel,-1,"click Me")
vbox.Add(self.btn,0,wx.ALIGN_CENTER)
self.btn.Bind(wx.EVT_BUTTON,self.OnClicked)
self.tbtn = wx.ToggleButton(panel , -1, "click to on")
vbox.Add(self.tbtn,0,wx.EXPAND|wx.ALIGN_CENTER)
self.tbtn.Bind(wx.EVT_TOGGLEBUTTON,self.OnToggle)
hbox = wx.BoxSizer(wx.HORIZONTAL)
bmp = wx.Bitmap("NEW.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
hbox.Add(self.bmpbtn,0,wx.ALIGN_CENTER)
self.bmpbtn.Bind(wx.EVT_BUTTON,self.OnClicked)
self.bmpbtn.SetLabel("NEW")
bmp1 = wx.Bitmap("OPEN.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn1 = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp1,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
hbox.Add(self.bmpbtn1,0,wx.ALIGN_CENTER)
self.bmpbtn1.Bind(wx.EVT_BUTTON,self.OnClicked)
self.bmpbtn1.SetLabel("OPEN")
bmp2 = wx.Bitmap("SAVE.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn2 = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp2,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
hbox.Add(self.bmpbtn2,0,wx.ALIGN_CENTER)
self.bmpbtn2.Bind(wx.EVT_BUTTON,self.OnClicked)
self.bmpbtn2.SetLabel("SAVE")
vbox.Add(hbox,1,wx.ALIGN_CENTER)
panel.SetSizer(vbox)
self.Centre()
self.Show()
self.Fit()
def OnClicked(self, event):
btn = event.GetEventObject().GetLabel()
print "Label of pressed button = ",btn
def OnToggle(self,event):
state = event.GetEventObject().GetValue()
if state == True:
print "Toggle button state off"
event.GetEventObject().SetLabel("click to off")
else:
print " Toggle button state on"
event.GetEventObject().SetLabel("click to on")
app = wx.App()
Mywin(None, 'Button demo')
app.MainLoop()
Yukarıdaki kod aşağıdaki çıktıyı üretir -
Basılan düğmenin etiketi = Beni tıklayın
Düğme durumunu kapat
Düğme durumunu aç / kapat
Basılan düğmenin etiketi = YENİ
Basılan düğmenin etiketi = AÇIK
Basılan düğmenin etiketi = KAYDET
wxAuiwxWidgets API'ye dahil edilmiş bir Gelişmiş Kullanıcı Arayüzü kitaplığıdır. Wx.aui.AuiManager, AUI çerçevesindeki merkezi sınıf.
AuiManagerwx.aui.AuiPanelInfo nesnesindeki her panelin bilgilerini kullanarak belirli bir çerçeveyle ilişkili bölmeleri yönetir. PanelInfo nesne kontrol yerleştirme ve kayan davranışın çeşitli özelliklerini öğrenelim.
Üst düzey çerçeveye yerleştirilebilir pencereler yerleştirmek aşağıdaki adımları içerir -
Önce, bir AuiManager nesnesi oluşturun.
self.mgr = wx.aui.AuiManager(self)
Ardından gerekli kontrollere sahip bir panel tasarlanır.
pnl = wx.Panel(self)
pbox = wx.BoxSizer(wx.HORIZONTAL)
text1 = wx.TextCtrl(pnl, -1, "Dockable", style = wx.NO_BORDER | wx.TE_MULTILINE)
pbox.Add(text1, 1, flag = wx.EXPAND)
pnl.SetSizer(pbox)
AuiPanelInfo'nun aşağıdaki parametreleri ayarlanır.
Direction - Üst, Alt, Sol, Sağ veya Orta
Position- Kenetlenebilir bir bölgeye birden fazla bölme yerleştirilebilir. Her birine bir pozisyon numarası verilir.
Row- Bir satırda birden fazla bölme görünür. Aynı satırda görünen birden fazla araç çubuğu gibi.
Layer - Bölmeler katmanlar halinde yerleştirilebilir.
Bu PanelInfo kullanılarak, tasarlanan panel yönetici nesnesine eklenir.
info1 = wx.aui.AuiPaneInfo().Bottom()
self.mgr.AddPane(pnl,info1)
Üst düzey pencerenin geri kalanında her zamanki gibi başka kontroller olabilir.
Kodun tamamı aşağıdaki gibidir -
import wx
import wx.aui
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title, size = (300,300))
self.mgr = wx.aui.AuiManager(self)
pnl = wx.Panel(self)
pbox = wx.BoxSizer(wx.HORIZONTAL)
text1 = wx.TextCtrl(pnl, -1, "Dockable", style = wx.NO_BORDER | wx.TE_MULTILINE)
pbox.Add(text1, 1, flag = wx.EXPAND)
pnl.SetSizer(pbox)
info1 = wx.aui.AuiPaneInfo().Bottom()
self.mgr.AddPane(pnl, info1)
panel = wx.Panel(self)
text2 = wx.TextCtrl(panel, size = (300,200), style = wx.NO_BORDER | wx.TE_MULTILINE)
box = wx.BoxSizer(wx.HORIZONTAL)
box.Add(text2, 1, flag = wx.EXPAND)
panel.SetSizerAndFit(box)
self.mgr.Update()
self.Bind(wx.EVT_CLOSE, self.OnClose)
self.Centre()
self.Show(True)
def OnClose(self, event):
self.mgr.UnInit()
self.Destroy()
app = wx.App()
Mywin(None,"Dock Demo")
app.MainLoop()
Yukarıdaki kod aşağıdaki çıktıyı üretir -
Tipik bir GUI uygulamasının birden çok penceresi olabilir. Sekmeli ve yığılmış widget'lar, bir seferde bu tür bir pencereyi etkinleştirmeye izin verir. Ancak, diğer pencerelerin görünümü gizlendiğinden, çoğu zaman bu yaklaşım yararlı olmayabilir.
Birden çok pencereyi aynı anda görüntülemenin bir yolu, onları bağımsız pencereler olarak oluşturmaktır. Buna SDI (Single Document Interface). Bu, her pencere kendi menü sistemine, araç çubuğuna vb. Sahip olabileceğinden daha fazla bellek kaynağı gerektirir.
WxPython'daki MDI çerçevesi, bir wx.MDIParentFrame sınıfı sağlar. Nesnesi, her biri wx.MDIChildFrame sınıfının bir nesnesi olan birden çok alt pencere için bir kap görevi görür.
Alt pencereler, üst çerçevenin MDIClientWindow alanında bulunur. Bir alt çerçeve eklenir eklenmez, ana çerçevenin menü çubuğu, çocukları basamaklı veya döşemeli bir şekilde düzenlemek için düğmeler içeren bir Pencere menüsü gösterir.
Misal
Aşağıdaki örnek, MDIParentFrame'in en üst düzey pencere olarak kullanımını göstermektedir. NewWindow adlı bir Menü düğmesi, istemci alanına bir alt pencere ekler. Birden çok pencere eklenebilir ve ardından kademeli veya döşemeli bir sırada düzenlenebilir.
Kodun tamamı aşağıdaki gibidir -
import wx
class MDIFrame(wx.MDIParentFrame):
def __init__(self):
wx.MDIParentFrame.__init__(self, None, -1, "MDI Parent", size = (600,400))
menu = wx.Menu()
menu.Append(5000, "&New Window")
menu.Append(5001, "&Exit")
menubar = wx.MenuBar()
menubar.Append(menu, "&File")
self.SetMenuBar(menubar)
self.Bind(wx.EVT_MENU, self.OnNewWindow, id = 5000)
self.Bind(wx.EVT_MENU, self.OnExit, id = 5001)
def OnExit(self, evt):
self.Close(True)
def OnNewWindow(self, evt):
win = wx.MDIChildFrame(self, -1, "Child Window")
win.Show(True)
app = wx.App()
frame = MDIFrame()
frame.Show()
app.MainLoop()
Yukarıdaki kod aşağıdaki çıktıyı üretir -
GDI+ (Grafik Çizim Arayüzü), CoreGraphics ve Cairo librarieswxPython'da çizim API'sinin çerçevesini oluşturur. wx.GraphicsContext, çeşitli Device Context nesnelerinin oluşturulduğu birincil çizilebilir nesnedir.
wx.DC soyut bir sınıftır. Türetilmiş sınıfları, farklı cihazlarda grafik ve metin oluşturmak için kullanılır. Device Context sınıfları şunlardır:
wx.ScreenDC - Tek bir pencerenin aksine ekranı boyamak için bunu kullanın.
wx.ClientDC - Bunu, pencerenin istemci alanını (kenarlıksız ve diğer süslemesiz kısım) boyamak için kullanın, ancak bir wxPaintEvent içinde kullanmayın.
wx.PaintDC- Bunu, pencerenin istemci alanını boyamak için kullanın, ancak yalnızca bir wxPaintEvent içinden.
wx.WindowDC- Dekorasyonlar da dahil olmak üzere pencerenin tüm alanını boyamak için bunu kullanın. Bu, Windows olmayan platformlarda mevcut olmayabilir.
WxPython'un Çizim API'si şekil, metin ve görüntü çizmek için farklı işlevler sunar. Renk, Kalem, Fırça ve Yazı Tipi gibi çizim amacıyla gerekli nesneler de GDI sınıfları kullanılarak oluşturulabilir.
wx.Colour Sınıfı
Renk nesnesi, her biri 0-255 ölçeğinde olan RGB (KIRMIZI, Yeşil ve Mavi) yoğunluk değerlerinin kombinasyonunu temsil eder. Aşağıdakiler gibi önceden tanımlanmış birkaç renk nesnesi vardır:
- wxBLACK
- wxBLUE
- wxCYAN
- wxGREEN
- wxYELLOW
- wxLIGHT_GREY
- wxRED
- wxWHITE
RGB değerlerinin özel kombinasyonuna sahip renk, wx.Colour object.
wx.Colour(r,g,b)
wx.Pen Sınıfı
Kalem nesnesi, çizgi, dikdörtgen, daire vb. Grafiklerin şeklinin rengini, genişliğini ve stilini belirler.
Predefined Pen objects -
wxBLACK_DASHED_PEN |
wxBLACK_PEN |
wxBLUE_PEN |
wxCYAN_PEN |
wxGREEN_PEN |
wxYELLOW_PEN |
wxGREY_PEN |
wxLIGHT_GREY_PEN |
wxMEDIUM_GREY_PEN |
wxRED_PEN |
wxTRANSPARENT_PEN |
wxWHITE_PEN |
Predefined Pen styles -
wx.SOLID |
wx.DOT |
wx.LONG_DASH |
wx.SHORT_DASH |
wx.DOT_DASH |
wx.TRANSPARENT |
wx.Brush Sınıfı
Fırça, dikdörtgen, elips, daire vb. Gibi şekillerin arka planlarını doldurmak için gereken başka bir temel grafik nesnesidir.
Özel bir Brush nesnesi, wx.Colour ve Brush stili parametreleri gerektirir. Aşağıda, önceden tanımlanmış fırça stillerinin bir listesi verilmiştir -
wx.SOLID |
wx.STIPPLE |
wx.BDIAGONAL_HATCH |
wx.CROSSDIAG_HATCH |
wx.FDIAGONAL_HATCH |
wx.CROSS_HATCH |
wx.HORIZONTAL_HATCH |
wx.VERTICAL_HATCH |
wx.TRANSPARENT |
wxPython, farklı şekil, metin ve görüntü çizmeyi kolaylaştıran bir dizi işleve sahiptir.
SN | Fonksiyonlar ve Açıklama |
---|---|
1 | DrawRectangle() Verilen boyutlarda bir dikdörtgen çizer |
2 | DrawCircle() Verilen noktada merkez ve yarıçap olarak bir daire çizer |
3 | DrawEllipse() Verilen x ve y yarıçapına sahip bir elips çizer |
4 | DrawLine() İki wx.Point nesnesi arasında bir çizgi çizer |
5 | DrawBitmap() Verilen konumda bir resim çizin |
6 | DrawText() Verilen metni belirtilen konumda görüntüler |
Misal
Yukarıdaki işlevler, Kalem, Fırça, Renk ve Yazı tipi nesnelerinden yararlanılarak aşağıdaki örnekte uygulanmaktadır.
Kodun tamamı aşağıdaki gibidir -
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (500,300))
self.InitUI()
def InitUI(self):
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Centre()
self.Show(True)
def OnPaint(self, e):
dc = wx.PaintDC(self)
brush = wx.Brush("white")
dc.SetBackground(brush)
dc.Clear()
dc.DrawBitmap(wx.Bitmap("python.jpg"),10,10,True)
color = wx.Colour(255,0,0)
b = wx.Brush(color)
dc.SetBrush(b)
dc.DrawCircle(300,125,50)
dc.SetBrush(wx.Brush(wx.Colour(255,255,255)))
dc.DrawCircle(300,125,30)
font = wx.Font(18, wx.ROMAN, wx.ITALIC, wx.NORMAL)
dc.SetFont(font)
dc.DrawText("Hello wxPython",200,10)
pen = wx.Pen(wx.Colour(0,0,255))
dc.SetPen(pen)
dc.DrawLine(200,50,350,50)
dc.SetBrush(wx.Brush(wx.Colour(0,255,0), wx.CROSS_HATCH))
dc.DrawRectangle(380, 15, 90, 60)
ex = wx.App()
Mywin(None,'Drawing demo')
ex.MainLoop()
Yukarıdaki kod aşağıdaki çıktıyı üretir -
Hükmü drag and dropkullanıcı için çok sezgiseldir. Kullanıcının nesneleri bir pencereden diğerine yalnızca fareyle sürükleyip başka bir pencereye bırakarak kopyalayabildiği veya taşıyabildiği birçok masaüstü uygulamasında bulunur.
Sürükle ve bırak işlemi aşağıdaki adımları içerir -
- Bırakma hedefi bildirin
- Veri nesnesi oluştur
- Wx.DropSource oluştur
- Sürükleme işlemini yürüt
- Bırakmayı iptal et veya kabul et
WxPython'da önceden tanımlanmış iki düşme hedefi vardır -
- wx.TextDropTarget
- wx.FileDropTarget
Çoğu wxPython widget'ı sürükle ve bırak etkinliğini destekler. Kaynak kontrolünde sürükleme etkinleştirilmiş olmalıdır, oysa hedef kontrol sürüklemeyi kabul edecek (veya reddedecek) konumda olmalıdır.
Kullanıcının sürüklediği Kaynak Veriler, hedef nesneye yerleştirilir. Hedef nesnenin OnDropText () öğesi verileri tüketir. İstenirse, kaynak nesneden gelen veriler silinebilir.
Misal
Aşağıdaki örnekte, iki ListCrl nesnesi bir Kutu Boyutlandırıcıya yatay olarak yerleştirilmiştir. Soldaki liste bir dil [] verisi ile doldurulur. Sürtünmenin kaynağı olarak belirlenmiştir. Sağdaki biri hedef.
languages = ['C', 'C++', 'Java', 'Python', 'Perl', 'JavaScript', 'PHP', 'VB.NET','C#']
self.lst1 = wx.ListCtrl(panel, -1, style = wx.LC_LIST)
self.lst2 = wx.ListCtrl(panel, -1, style = wx.LC_LIST)
for lang in languages:
self.lst1.InsertStringItem(0,lang)
İkinci liste denetimi boştur ve TextDropTarget sınıfının nesnesi için bir bağımsız değişkendir.
class MyTextDropTarget(wx.TextDropTarget):
def __init__(self, object):
wx.TextDropTarget.__init__(self)
self.object = object
def OnDropText(self, x, y, data):
self.object.InsertStringItem(0, data)
OnDropText () yöntemi, hedef liste denetimine kaynak verileri ekler.
Sürükleme işlemi, olay bağlayıcı tarafından başlatılır.
wx.EVT_LIST_BEGIN_DRAG(self, self.lst1.GetId(), self.OnDragInit)
OnDragInit () işlevi, sürükleme verilerini hedefe koyar ve kaynaktan siler.
def OnDragInit(self, event):
text = self.lst1.GetItemText(event.GetIndex())
tobj = wx.PyTextDataObject(text)
src = wx.DropSource(self.lst1)
src.SetData(tobj)
src.DoDragDrop(True)
self.lst1.DeleteItem(event.GetIndex())
Kodun tamamı aşağıdaki gibidir -
import wx
class MyTarget(wx.TextDropTarget):
def __init__(self, object):
wx.TextDropTarget.__init__(self)
self.object = object
def OnDropText(self, x, y, data):
self.object.InsertStringItem(0, data)
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (-1,300))
panel = wx.Panel(self)
box = wx.BoxSizer(wx.HORIZONTAL)
languages = ['C', 'C++', 'Java', 'Python', 'Perl', 'JavaScript',
'PHP', 'VB.NET','C#']
self.lst1 = wx.ListCtrl(panel, -1, style = wx.LC_LIST)
self.lst2 = wx.ListCtrl(panel, -1, style = wx.LC_LIST)
for lang in languages:
self.lst1.InsertStringItem(0,lang)
dt = MyTarget(self.lst2)
self.lst2.SetDropTarget(dt)
wx.EVT_LIST_BEGIN_DRAG(self, self.lst1.GetId(), self.OnDragInit)
box.Add(self.lst1,0,wx.EXPAND)
box.Add(self.lst2, 1, wx.EXPAND)
panel.SetSizer(box)
panel.Fit()
self.Centre()
self.Show(True)
def OnDragInit(self, event):
text = self.lst1.GetItemText(event.GetIndex())
tobj = wx.PyTextDataObject(text)
src = wx.DropSource(self.lst1)
src.SetData(tobj)
src.DoDragDrop(True)
self.lst1.DeleteItem(event.GetIndex())
ex = wx.App()
Mywin(None,'Drag&Drop Demo')
ex.MainLoop()
Yukarıdaki kod aşağıdaki çıktıyı üretir -