pagenoare's devblog

python ftw!

wxpython – hello world [1]

| written by pagenoare, on Oct 17, 2008 2:46:02 PM.

Ostatnio (huh, po tym gdy porzuciłem Ubuntu) zainteresowałem się pakietem wxpython – który w banalny sposób pozwala tworzyć interfejs użytkownika (GUI). W porównaniu do pygtk jest on wg mnie o niebo prostszy – tak jak w pygtk miałem trudności w zrozumieniu „czemu tak a nie inaczej” tutaj wszystko jest dla mnie jasne i oczywiste. Ponieważ w Internecie [chyba] nikt nie pisał wprowadzenia po Polsku, postaram się to zrobić (jak wyjdzie, tego nie wiem ;)).

Z czym to się je

  1. GUI dzielimy na: wx.App, wx.Frame i w nim MenuBary, Panele i inne elementy, które chcemy umieścić. Ten obrazek oddaje treść powyższego zdania.
  2. Pisząc interfejs użytkownika piszemy klasy dziedzicząc elementy wx.
  3. W prostych aplikacjach nie ma sensu pisać własnej klasy „App”, dlatego ja zawszę używam wx.PySimpleApp, które całkowicie mi wystarcza.

Hello world

Założenia: zaczniemy od napisania klasy Frame (główne okno aplikacji). Jak wyżej napisałem stworzymy klasę, która będzie dziedziczyła po wx.Frame i w niej umieścimy wx.Panel, który będzie posiadał napis (StaticText) „Hello World”, który z kolei będzie w BoxSizerze (Sizery pomagają nam umiejscowić elementy w Frame, ustalić ich wielkość itp.). Zagmatwane, co nie? Zacznijmy pisać a wszystko stanie się proste :-).

Piszemy: Otwórzmy plik „hello_1.py” w naszym ulubionym edytorze i napiszmy nagłówek:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import wx # importujemy komponenty wx

Następnie klasę z metodą init (argumenty: self, parent, id, title)

class Okno(wx.Frame):
        
        def __init__(self, parent, id, title):
                pass

W metodzie __init__ zainicjujmy wx.Frame, przez co będziemy mieli dostęp do wszystkich atrybutów z w/w komponentu:

wx.Frame.__init__(self, parent, wx.ID_ANY, title, size = (400, 50))

Zdefiniujmy zmienną "panel", która będzie elementem wx.Panel:

panel = wx.Panel(self, -1)

Następnie pod zmienną "box" podstawmy BoxSizera oraz dodajmy StaticText (wx.ALIGN_CENTER - ustawiamy wyśrodkowanie tekstu, wx.ALL - zachowanie w BoxSizerze, ostatni parametr - padding):

box = wx.BoxSizer(wx.HORIZONTAL)
box.Add(wx.StaticText(panel, -1, 'Hello from my first wx app!', style = wx.ALIGN_CENTER), 1, wx.ALL, 5)

Dodajmy BoxSizera do panelu:

panel.SetSizer(box)

Ustawmy wx.Frame na środku ekranu oraz "uwidocznijmy" ją:

self.Centre()
self.Show(True)

I mamy - metoda __init__ gotowa, czas na ostateczny krok - uruchamianie:

if __name__ == '__main__':
    app = wx.PySimpleApp()
    main = Okno(None, -1, "Hello World")
    app.MainLoop()

Wrzucam cały kod, gdyby ktoś się zgubił:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import wx

class Okno(wx.Frame):
        
        def __init__(self, parent, id, title):
                wx.Frame.__init__(self, parent, wx.ID_ANY, title, size = (400, 50))
                panel = wx.Panel(self, -1)
                
                box = wx.BoxSizer(wx.HORIZONTAL)
                box.Add(wx.StaticText(panel, -1, 'Hello from my first wx app!', style = wx.ALIGN_CENTER), 1, wx.ALL, 5)
                
                panel.SetSizer(box)
                self.Centre()
                self.Show(True)
                

if __name__ == '__main__':
    app = wx.PySimpleApp()
    main = Okno(None, -1, "Hello World")
    app.MainLoop()

Uruchamiamy standardowo:

python hello_1.py

I naszym oczom ukaże się:

Oto jest - nasza pierwsza aplikacja w pythonie z interfejsem użytkownika!

Comments

  • Przetłumaczyłem na polski podręcznik do wxPythona Jana Bodrnara, którego oryginał mieści się na stronie http://zetcode.com/wxpython/. Nie wiem, jak go udostępnić. A może ktoś wcześniej jeszcze by sprawdził (najlepiej jakiś programista) to tłumaczenie?

    Comment by Krzysztof — Nov 23, 2009 3:43:26 PM | # - re

  • Krzysztof: możesz podrzucić na pagenoare [at] gmail.com, w przyszłym tygodniu powinienem mieć czas, to mogę sprawdzić ;)

    Comment by pagenoare — Nov 23, 2009 7:57:59 PM | # - re

  • Witam. Jestem zainteresowany jak rozwinęła się sprawa tego tłumaczenia?

    Comment by qwerty — Dec 7, 2009 10:54:56 AM | # - re

  • można prosić o ten podręcznik?

    Comment by joahim — Apr 11, 2010 11:28:46 AM | # - re

Leave a Reply