31 Aralık 2014 Çarşamba

WxPython Örnekler

İlk önce en basit uygulama :

# -*- coding: utf-8 -*-
import wx

app = wx.App()

frame = wx.Frame(None, -1, "BASİT")
frame.Show()

app.MainLoop()

 önce uygulama tanımlanıyor, sonra frame ile pencere tanımölanıyor. Sonrada frame görünür yapılıp, uygulama başlatılıyor.


Şimdi yazdığımız uygulamanın boyutunu ayarlayan satırlar. Bu sefer biraz daha yapısal bir uygulama yazılımı gösteriyoruz :

# -*- coding: utf-8 -*-
import wx

class Deneme(wx.Frame):
  
  def __init__(self, parent, title):
    super(Deneme, self).__init__(parent, title=title, size=(250, 200))
    
    self.Show()
    
if __name__ == "__main__" :
  app = wx.App()
  Deneme(None, title="Size")
  app.MainLoop()

Önce yukarıda Deneme adında yeni bir sınıfı Frame sınıfından üretip özelliklerinde boyutunu 250x200 pixel olarak ayarlıyoruz, sonra aşağıda uygulamayı çalıştırmaya yönelik kodları koyuyoruz. Bu aşağıdaki kısımda değişiklik yapmadan açılan pencere içeriğini yukarda sınıf tanımında yapmayı planlıyoruz.
Şimdi de ekranı ortalayalım :

# -*- coding: utf-8 -*-
import wx

class Deneme(wx.Frame):
  
  def __init__(self, parent, title):
    super(Deneme, self).__init__(parent, title=title, size=(300, 200))
    
    self.Centre()
    self.Show()
    
if __name__ == "__main__" :
  app = wx.App()
  Deneme(None, title="Merkezde")
  app.MainLoop()

İlk Menümüzü kullanalım bakalım :

# -*- coding: utf-8 -*-
import wx

class Deneme(wx.Frame):
  
  def __init__(self, *args, **kwargs):
    super(Deneme, self).__init__(*args, **kwargs)
    
    self.InitUI()
    
  def InitUI(self):
    menubar = wx.MenuBar()
    filemenu = wx.Menu()
    fitem = filemenu.Append(wx.ID_EXIT, "Çık", "Uygulamadan Çık")
    menubar.Append(filemenu, "&Dosya")
    self.SetMenuBar(menubar)
    
    self.Bind(wx.EVT_MENU, self.OnQuit, fitem)
    
    self.SetSize((300,200))
    self.SetTitle('Basit Menü')
    self.Centre()
    self.Show()
    
  def OnQuit(self, e):
    self.Close()
    
    
    
if __name__ == "__main__" :
  app = wx.App()
  Deneme(None)
  app.MainLoop()

Önce bir MenuBar tanımlıyoruz ki bu menünün tamamını oluşturur. İkinci olarak bir menü tanımlıyoruz, bu da menüde pencerede görünen menü başlıklarıdır. Son olarak menü içine eklenecek bir item tanımlıyoruz. wx.ID_EXIT ile standart uygulama çıkış menüsü item olarak ekleniyor. Menübar'a "Dosya" menüsü eklendikten sonra uygulamamıza işte bu senin menübar'ın diye gösteriyoruz.

Bind komutu ile tanımladığımız menü item tıklama olayını OnQuit metoduna bağlıyoruz. OnQuit metodu tanımlamasına da Close() yazarak uygulamadan çıkılmasını sağlıyoruz. Gerisi bildiğiniz şeyler :



İkonlar ve Kısayollar

# -*- coding: utf-8 -*-
import wx

APP_EXIT = 1

class Deneme(wx.Frame):
  
  def __init__(self, *args, **kwargs):
    super(Deneme, self).__init__(*args, **kwargs)
    
    self.InitUI()
    
  def InitUI(self):
    menubar = wx.MenuBar()
    filemenu = wx.Menu()
    qmi = wx.MenuItem(filemenu, APP_EXIT, "Çı&k\tCtrl+Q")
    qmi.SetBitmap(wx.Bitmap('images/exit.png'))
    filemenu.AppendItem(qmi)
    
    self.Bind(wx.EVT_MENU, self.OnQuit, id=APP_EXIT)
    
    menubar.Append(filemenu, '&Dosya')
    self.SetMenuBar(menubar)
    
    self.SetSize((300,200))
    self.SetTitle('İkonlar Kısayollar')
    self.Centre()
    self.Show()
    
  def OnQuit(self, e):
    self.Close()
    
    
    
if __name__ == "__main__" :
  app = wx.App()
  Deneme(None)
  app.MainLoop()


Ne fark var? bir wx.MenuItem tanımlıyoruz "k" harfine veya Ctrl+Q tuşlamasıyla da bu menü aktivasyonunun çalıştırılabileceği yönünde kısayol tanımları yapıyoruz. Bu hareketler bildiğiniz gibi tüm pencereli programlarda kullandığınız şeyler. Menüye bir de resim tanımlıyoruz. Bu esimleri nerde bulurum derseniz , linux kullananlar "/usr/share/" klasörü içinde "exit.png" aratırsanız diğer uygulamaların kullandığı ikonlardan bulabilirsiniz.findicons.com da bir sürü ikon var mesela böyle internetten de bulunabilir. Daha sonra Bind ile bu menüye "id" si üzerinden OnQuit metodunu bağlıyoruz.

Burada APP_EXIT ismi verilen bir sabit tanımlanmış ve onu kullanarak "id" üzerinden bağlantının nasıl yapıldığı gösterilmiştir. Burada APP_EXIT yerine isterseniz temsil ettiği "1" sayısını da kullanabilirsiniz, bu programın çalışmasını değiştirmez. Burada amaç hem size "id" üzerinden bağlantının nasıl kurulduğunu göstermek, aynı zamanda ilerde bissürü menü elemanınız olunca her birine ayrı numaraları verirken karıştırmamak için tüm "id" numaralandırmalarını programın bir noktasında toplamak.

Şunu unutmayın iş yapan bir uygulama yazmaya kalktığınızda bazen binlerce satır kod yazarsınız , burda kodun içinde kaybolmamak için bu şekil amacı belirten değişken isimleri ile çalışmak çok önemlidir. Değişkenlerin adı ne kadar uzun olursa olsun açıklayıcı olsun, nasıl olsa editörler iki-üç harf yazınca size önceden yazdığınız kelimeleri hatırlatmaya başlıyor.


Altmenüler ve Separatörler

# -*- coding: utf-8 -*-
import wx

class Deneme(wx.Frame):
  
  def __init__(self, *args, **kwargs):
    super(Deneme, self).__init__(*args, **kwargs)
    
    self.InitUI()
    
  def InitUI(self):
    menubar = wx.MenuBar()
    
    filemenu = wx.Menu()
    filemenu.Append(wx.ID_NEW, '&Yeni')
    filemenu.Append(wx.ID_OPEN, '&Aç')
    filemenu.Append(wx.ID_SAVE, '&Kaydet')
    filemenu.AppendSeparator()
    
    imp = wx.Menu()
    imp.Append(wx.ID_ANY, 'Newsfeed listesi al...')
    imp.Append(wx.ID_ANY, 'Bookmark al...')
    imp.Append(wx.ID_ANY, 'Mail al...')
    
    filemenu.AppendMenu(wx.ID_ANY, 'İçeri A&l', imp)
    qmi = wx.MenuItem(filemenu, wx.ID_EXIT, "Çı&k\tCtrl+Q")
    filemenu.AppendItem(qmi)
    
    self.Bind(wx.EVT_MENU, self.OnQuit, qmi)
    
    menubar.Append(filemenu, '&Dosya')
    self.SetMenuBar(menubar)
    
    self.SetSize((300,200))
    self.SetTitle('Alt Menü')
    self.Centre()
    self.Show()
    
  def OnQuit(self, e):
    self.Close()
    
    
    
if __name__ == "__main__" :
  app = wx.App()
  Deneme(None)
  app.MainLoop()



Bu uygulamada xwWidgets'in orjinal tanımlı menüleri ve ikonları kullanılmıştır. Bir listesi için tıklayın. Gördüğünüz gibi alt menü yapmak için yeni bir menü tanımlanıyor be bu menü sanki bir menü item gibi üst menüye ekleniyor. Bir de yeni olarak AddSeparator() komutu ile menüye bir grup ayırıcı yatay separatör konuyor.

Check Menü Elemanı

Üç çeşit menü elemanı vardır :
  1. Normal eleman
  2. Check Eleman
  3. Radio eleman
Şimdiye kadar kullandıklarımız normal menü elemanlarıydı. Şimdi Check menü elemanı örneği :

# -*- coding: utf-8 -*-
import wx

class Deneme(wx.Frame):
  
 def __init__(self, *args, **kwargs):
  super(Deneme, self).__init__(*args, **kwargs)
    
  self.InitUI()
    
 def InitUI(self):
  menubar = wx.MenuBar()
  filemenu = wx.Menu()
  viewmenu = wx.Menu()
    
  self.shst = viewmenu.Append(wx.ID_ANY, 'Statusbar Göster', 
              kind=wx.ITEM_CHECK)
  self.shtl = viewmenu.Append(wx.ID_ANY, 'Toolbar Göster', 
              kind=wx.ITEM_CHECK)
  
  viewmenu.Check(self.shst.GetId(), True)
  viewmenu.Check(self.shtl.GetId(), True)
    
  self.Bind(wx.EVT_MENU, self.ToggleStatusBar, self.shst)
  self.Bind(wx.EVT_MENU, self.ToggleToolBar, self.shtl)
  
  menubar.Append(filemenu, '&Dosya')
  menubar.Append(viewmenu, '&Görüntü')
  self.SetMenuBar(menubar)
  
  self.toolbar = self.CreateToolBar()
  self.toolbar.AddLabelTool(1, '', wx.Bitmap('images/exit.png'))
  self.toolbar.Realize()
  
  self.statusbar = self.CreateStatusBar()
  self.statusbar.SetStatusText('Hazır')
  
  self.SetSize((300,200))
  self.SetTitle('Check Menü Elemanı')
  self.Centre()
  self.Show()
    
 def ToggleStatusBar(self, e):
  if self.shst.IsChecked():
   self.statusbar.Show()
  else:
   self.statusbar.Hide()

 def ToggleToolBar(self, e):
  if self.shtl.IsChecked():
   self.toolbar.Show()
  else:
   self.toolbar.Hide()
  
  
  
if __name__ == "__main__" :
 app = wx.App()
 Deneme(None)
 app.MainLoop()

Oh oh herşey var, statusbar nasıl tanımlanır, toolbar nasıl tanımlanır, check menü elemanları.. Bir önemli ve kritik nokta daha var, bisürü "self" kelimesi neden? InitUi metodu içinde tanımladığımız elemanların özelliklerini diğer metodların içinde değiştirmek istiyoruz, o zaman bu elemanlara metod dışından erişilebilmesi için bunları sınıfa ait değişkenler olarak herbirinin başına "self" kelimesi koyarak tanımlıyoruz. Daha önce de aynı şekilde dışarıda tanımlanmış metodları çağırıyorduk hatırlarsanız.




Context Menü

Context menü sağ tuş tıklayınca çıkan menülere verilen addır:
# -*- coding: utf-8 -*-
import wx

class BenimPopupMenu(wx.Menu):
 def __init__(self, parent):
  super(BenimPopupMenu, self).__init__()
  
  self.parent = parent
  
  mmi = wx.MenuItem(self, wx.NewId(), 'Küçült')
  self.AppendItem(mmi)
  self.Bind(wx.EVT_MENU, self.OnMinimize, mmi)
  
  cmi = wx.MenuItem(self, wx.NewId(), 'Kapat')
  self.AppendItem(cmi)
  self.Bind(wx.EVT_MENU, self.OnClose, cmi)
 
 
 def OnMinimize(self, e):
  self.parent.Iconize()
  
 def OnClose(self, e):
  self.parent.Close()

class Deneme(wx.Frame):
  
 def __init__(self, *args, **kwargs):
  super(Deneme, self).__init__(*args, **kwargs)
    
  self.InitUI()
    
 def InitUI(self):
  self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
  
  self.SetSize((250,200))
  self.SetTitle('Context Menü')
  self.Centre()
  self.Show()
  
 def OnRightDown(self, e):
  self.PopupMenu(BenimPopupMenu(self), e.GetPosition())
  
  
if __name__ == "__main__" :
 app = wx.App()
 Deneme(None)
 app.MainLoop()




Toolbar

# -*- coding: utf-8 -*-
import wx


class Deneme(wx.Frame):
  
 def __init__(self, *args, **kwargs):
  super(Deneme, self).__init__(*args, **kwargs)
    
  self.InitUI()
    
 def InitUI(self):
  
  toolbar = self.CreateToolBar()
  qtool = toolbar.AddLabelTool(wx.ID_ANY, 'Çıkış', wx.Bitmap('images/exit.png'))
  toolbar.Realize()
  
  self.Bind(wx.EVT_TOOL, self.OnQuit, qtool)
  
  self.SetSize((250,200))
  self.SetTitle('Basit Toolbar')
  self.Centre()
  self.Show()
  
 def OnQuit(self, e):
  self.Close()
  
  
if __name__ == "__main__" :
 app = wx.App()
 Deneme(None)
 app.MainLoop()

CreateToolBar ile uygulamanın toolbar'ını tanımlıyoruz, ardından AddLabelTool ile çıkış simgesini toolbarımıza ekliyoruz. En son Realize komutuyla toolbar'ı ekranda gerçekleştiriyoruz.



Enable , disable

Toolbar objelerinin tıklanmasına izin vermek ya da vermemek.

# -*- coding: utf-8 -*-
import wx


class Deneme(wx.Frame):
  
 def __init__(self, *args, **kwargs):
  super(Deneme, self).__init__(*args, **kwargs)
    
  self.InitUI()
    
 def InitUI(self):
  
  self.count = 5
  
  self.toolbar = self.CreateToolBar()
  tundo = self.toolbar.AddLabelTool(wx.ID_UNDO,'',wx.Bitmap('images/undo.png'))
  tredo = self.toolbar.AddLabelTool(wx.ID_REDO,'',wx.Bitmap('images/redo.png'))
  self.toolbar.EnableTool(wx.ID_REDO,False)
  self.toolbar.AddSeparator()
  texit = self.toolbar.AddLabelTool(wx.ID_EXIT,'',wx.Bitmap('images/exit.png'))
  self.toolbar.Realize()
  
  self.Bind(wx.EVT_TOOL, self.OnQuit, texit)
  self.Bind(wx.EVT_TOOL, self.OnUndo, tundo)
  self.Bind(wx.EVT_TOOL, self.OnRedo, tredo)
  
  self.SetSize((250,200))
  self.SetTitle('Enable Disable')
  self.Centre()
  self.Show()
  
 def OnQuit(self, e):
  self.Close()
  
 def OnUndo(self, e):
  if self.count > 1 and self.count <= 5:
   self.count = self.count - 1
   
  if self.count == 1:
   self.toolbar.EnableTool(wx.ID_UNDO,False)
   
  if self.count == 4:
   self.toolbar.EnableTool(wx.ID_REDO,True)
   
 def OnRedo(self,e):
  if self.count < 5 and self.count >= 1:
   self.count = self.count + 1
   
  if self.count == 5:
   self.toolbar.EnableTool(wx.ID_REDO,False)
  
  if self.count == 2:
   self.toolbar.EnableTool(wx.ID_UNDO,True)
  
if __name__ == "__main__" :
 app = wx.App()
 Deneme(None)
 app.MainLoop()

Gördüğünüz gibi dışarıdaki metodlardan içerdeki tollbar'a müdahale ettiğimiz için yine bi sürü self kelimesi.





Hiç yorum yok:

Yorum Gönder