Täna vaatame veel edasi võimalusi luua graafilisi ehk akendes töötavaid programme. Seekord võtame selleks veidi teise akenderaamistiku nimega wx.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import wx
#esmalt teeme raami ehk akna
class MinuRaam(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, "Minu raam", size=(300, 300))
paneel = wx.Panel(self, -1) # raami (frame) lisatav paneel
# kui hiir on paneelil, siis pannakse toimetama meetod Liigub (all pool)
paneel.Bind(wx.EVT_MOTION, self.Liigub)
# lisatakse seisev tekst "Hiire koht:"
wx.StaticText(paneel, -1, "Hiire koht:", pos=(10, 12))
self.kohaNaitaja = wx.TextCtrl(paneel, -1, "", pos=(90, 10)) # lisatakse tekstikast, milles saab teksti vahetada
def Liigub(self, event): #meetod Liigub
pos = event.GetPosition() # küsitakse hiire koordinaadid
self.kohaNaitaja.SetValue("%s, %s" % (pos.x, pos.y)) # seatakse tekstikastis koordinaadid õigeks
if __name__ == '__main__':
rakendus = wx.PySimpleApp()
raam = MinuRaam()
raam.Show(True)
rakendus.MainLoop()
Pildi näitamine:
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""Tere wxPython!""" # dokument-kommentaar programmi juurde
import wx
class Raam(wx.Frame): # Raam on wx.Frame alamklass ehk järglasobjekt
"""Raam, mis kuvab pilti."""
def __init__(self, pilt, vanem=None, id=-1,
koht=wx.DefaultPosition,
tiitel='Tere, wxPython!'):
"""Loob raami ja kuvab pildi."""
temp = pilt.ConvertToBitmap()
suurus= temp.GetWidth(), temp.GetHeight()
wx.Frame.__init__(self, vanem, id, tiitel, koht, suurus)
self.bmp = wx.StaticBitmap(parent=self, bitmap=temp)
class Rakend(wx.App):
"""Rakendus klass"""
def OnInit(self):
pilt = wx.Image('logo2.jpg', wx.BITMAP_TYPE_JPEG)
self.frame = Raam(pilt)
self.frame.Show()
self.SetTopWindow(self.frame)
return True
def peamine():
rakendus= Rakend()
rakendus.MainLoop()
#programmi põhimeetod
if __name__ == '__main__':
peamine()
Joone tõmbamine 1 sekund pärast akna loomist:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import wx
class naide(wx.Frame):
def __init__(self, parent, title):
super(naide, self).__init__(parent, title=title,
size=(350, 170))
wx.FutureCall(1000, self.joonistajoon)
self.Centre()
self.Show()
def joonistajoon(self):
dc = wx.ClientDC(self)
dc.DrawLine(50, 30, 290, 150)
if __name__ == '__main__':
rakendus = wx.App()
naide(None, 'Line')
rakendus.MainLoop()
#!/usr/bin/python
# Pliiatsid.py
import wx
class Pliiatsid(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(350, 190))
self.Bind(wx.EVT_PAINT, self.joonistaja)
self.Centre()
self.Show(True)
def joonistaja(self, event):
dc = wx.PaintDC(self)
dc.SetPen(wx.Pen('#000000', 1, wx.SOLID))
dc.SetBrush(wx.Brush('#c56c00'))
dc.DrawRectangle(10, 15, 90, 60)
dc.SetPen(wx.Pen('#000000', 1, wx.DOT))
dc.SetBrush(wx.Brush('#1ac500'))
dc.DrawRectangle(130, 15, 90, 60)
dc.SetPen(wx.Pen('#000000', 1, wx.LONG_DASH))
dc.SetBrush(wx.Brush('#539e47'))
dc.DrawRectangle(250, 15, 90, 60)
dc.SetPen(wx.Pen('#000000', 1, wx.SHORT_DASH))
dc.SetBrush(wx.Brush('#004fc5'))
dc.DrawRectangle(10, 105, 90, 60)
dc.SetPen(wx.Pen('#000000', 1, wx.DOT_DASH))
dc.SetBrush(wx.Brush('#c50024'))
dc.DrawRectangle(130, 105, 90, 60)
dc.SetPen(wx.Pen('#000000', 1, wx.TRANSPARENT))
dc.SetBrush(wx.Brush('#5f3b00'))
dc.DrawRectangle(250, 105, 90, 60)
app = wx.App()
Pliiatsid(None, -1, 'Pliiatsid')
app.MainLoop()
Joonlaud on kasulik elementide kauguse mõõtmiseks :)
#!/usr/bin/python
import wx
RW = 701 # ruler widht
RM = 10 # ruler margin
RH = 60 # ruler height
class Ruler1(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(RW + 2*RM, 60),
style=wx.FRAME_NO_TASKBAR | wx.NO_BORDER | wx.STAY_ON_TOP)
self.font = wx.Font(7, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL,
wx.FONTWEIGHT_BOLD, False, 'Courier 10 Pitch')
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
self.Bind(wx.EVT_MOTION, self.OnMouseMove)
self.Centre()
self.Show(True)
def OnPaint(self, event):
dc = wx.PaintDC(self)
brush = wx.Brush('#0d0060')
dc.SetBrush(brush)
dc.DrawRectangle(0, 0, RW+2*RM, RH)
dc.SetFont(self.font)
dc.SetPen(wx.Pen('#F8FF25'))
dc.SetTextForeground('#F8FF25')
for i in range(RW):
if not (i % 100):
dc.DrawLine(i+RM, 0, i+RM, 10)
w, h = dc.GetTextExtent(str(i))
dc.DrawText(str(i), i+RM-w/2, 11)
elif not (i % 20):
dc.DrawLine(i+RM, 0, i+RM, 8)
elif not (i % 2): dc.DrawLine(i+RM, 0, i+RM, 4)
def OnLeftDown(self, event):
pos = event.GetPosition()
x, y = self.ClientToScreen(event.GetPosition())
ox, oy = self.GetPosition()
dx = x - ox
dy = y - oy
self.delta = ((dx, dy))
def OnMouseMove(self, event):
if event.Dragging() and event.LeftIsDown():
x, y = self.ClientToScreen(event.GetPosition())
fp = (x - self.delta[0], y - self.delta[1])
self.Move(fp)
def OnRightDown(self, event):
self.Close()
app = wx.App()
Ruler1(None, -1, '')
app.MainLoop()