以后可以在此基础上添加功能

#!/usr/bin/python
# submenu.py
import wx
import os
import cv
# For each item that triggers an event, allocate one ID
# Maybe you want to differentiate menu, toolbar, and others event sources
ID_OPEN = 1
ID_CLOSE = 2
ID_QUIT = 3
ID_PROC_GRAY = 11
ID_TOOL_OPEN = 101
ID_TOOL_CLOSE = 102
#iconpath = r'/home/bee33/win/Basic_set_Png'
iconpath = r'G:\win\Basic_set_Png'
# Context menu
class ImagePanel(wx.Panel):
def __init__(self, parent, id):
wx.Panel.__init__(self, parent, id)
self.bmp = None
self.Bind(wx.EVT_PAINT, self.OnPaint)
def OnPaint(self, event):
dc = wx.PaintDC(self)
# print 'In Panel'
if self.bmp:
dc.DrawBitmap(self.bmp, 0, 0)
def SetBmp(self, bmp):
self.bmp = bmp
class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(400, 600))
# Set icon
icon = wx.EmptyIcon()
icon.CopyFromBitmap(wx.Bitmap(os.path.join(iconpath,'buy_16.png'), wx.BITMAP_TYPE_ANY))
self.SetIcon(icon)
# Menubar
menubar = wx.MenuBar()
# Menu 1
file = wx.Menu()
file.Append(ID_OPEN, '&Open', 'Open an image')
file.Append(ID_CLOSE, '&Close', 'Close the image')
file.Append(ID_QUIT, '&Quit')
# Menu 2
proc_menu = wx.Menu()
proc_menu.Append(ID_PROC_GRAY, 'RGB->&Gray', 'RGB->Gray')
# Finally, the end for menu parts
menubar.Append(file, '&File')
menubar.Append(proc_menu, '&View')
self.SetMenuBar(menubar)
# Toolbar
self.toolbar = self.CreateToolBar()
self.toolbar.AddLabelTool(ID_TOOL_OPEN, '', wx.Bitmap(os.path.join(iconpath,'open16.png')),longHelp='Open a new image')
self.toolbar.AddLabelTool(ID_TOOL_CLOSE, '', wx.Bitmap(os.path.join(iconpath,'close16.png')),longHelp='Close the image')
self.toolbar.Realize()
# Status bar
self.statusbar = self.CreateStatusBar()
########### Client Area #############
panel = wx.Panel(self, -1)
# it is void, only shows how to deal with background color
#panel.SetBackgroundColour(panel.GetBackgroundColour())
######### Which sizer to use ############
# wx.BoxSizer: a row or a column. We can put another sizer into an existing sizer.
# wx.StaticBoxSizer: Identical to a wx.BoxSizer, with the one addition of a border (and optional
# caption) around the box.
# wx.GridSizer lays out widgets in two dimensional table.
# Each cell within the table has the same size.
# wx.FlexGridSizer: All cells in a row have the same height.
# All cells in a column have the same width.
# But all rows and columns are not necessarily the same height or width.
# box.Add(wx.Window window, integer proportion=0, integer flag = 0, integer border = 0)
# proportion: 0 - Do not change size
# it is relative, item with 2 changes twice the degree of item with 1
#
# Flag:
# wx.EXPAND: strech to the possible size
# wx.LEFT
# wx.RIGHT
# wx.BOTTOM
# wx.TOP
# wx.ALL: all the above are border margin flags
# wx.ALIGN_LEFT
# wx.ALIGN_RIGHT
# wx.ALIGN_TOP
# wx.ALIGN_BOTTOM
# wx.ALIGN_CENTER_VERTICAL
# wx.ALIGN_CENTER_HORIZONTAL
# wx.ALIGN_CENTER: the above are item alignment flags
# top sizer
vbox_top = wx.BoxSizer(wx.HORIZONTAL)
# Info Panel
pnlinfo = wx.Panel(panel, -1)
sbox1 = wx.StaticBoxSizer(wx.StaticBox(pnlinfo, -1, 'Info'), orient=wx.VERTICAL)
self.infost = wx.StaticText(pnlinfo, -1, '')
sbox1.Add(self.infost)
pnlinfo.SetSizer(sbox1)
# part 5, image panel
self.pnlimage = ImagePanel(panel, -1)
self.img = None
# a sizer can add a panel or another sizer
vbox_top.Add(self.pnlimage, 2, wx.EXPAND|wx.ALL, 5)
vbox_top.Add(pnlinfo, 1, wx.EXPAND|wx.ALL, 5)
# set top sizer
panel.SetSizer(vbox_top)
########## Event binding ##############
# Menu events binding
self.Bind(wx.EVT_MENU, self.OnOpen, id=ID_OPEN)
self.Bind(wx.EVT_MENU, self.OnClose, id=ID_CLOSE)
self.Bind(wx.EVT_MENU, self.OnQuit, id=ID_QUIT)
# Tool events binding
self.Bind(wx.EVT_TOOL, self.OnOpen, id=ID_TOOL_OPEN)
self.Bind(wx.EVT_TOOL, self.OnClose, id=ID_TOOL_CLOSE)
# self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_MENU, self.OnGray, id=ID_PROC_GRAY)
# Show the frame
self.Centre()
self.Show(True)
########## Event Handlers #############
def OnOpen(self, event):
wildcard = "Other Image files (*.*)|*.*|" \
"PNG Image (*.png)|*.png|" \
"JPG Image (*.jpg)|*.jpg"
dialog = wx.FileDialog(None, "Choose a file", os.getcwd(),
"", wildcard, wx.OPEN)
if dialog.ShowModal() == wx.ID_OK:
self.img = cv.LoadImage(dialog.GetPath())
self.infost.SetLabel('LaLaLa')
self.SetColorImg(self.img)
self.Refresh()
def OnClose(self, event):
self.img = None
self.pnlimage.SetBmp(None)
self.infost.SetLabel('')
self.Refresh()
def OnQuit(self, event):
self.Close()
def OnGray(self, event):
if self.img:
img2 = cv.CreateImage(cv.GetSize(self.img), cv.IPL_DEPTH_8U, 1)
cv.CvtColor(self.img, img2, cv.CV_BGR2GRAY)
self.SetGrayImg(img2)
self.Refresh()
def SetColorImg(self, img):
if img:
img2 = cv.CreateImage(cv.GetSize(img), cv.IPL_DEPTH_8U, 3)
cv.CvtColor(img, img2, cv.CV_BGR2RGB)
bmp = wx.BitmapFromBuffer(img2.width, img2.height, img2.tostring())
self.pnlimage.SetBmp(bmp)
def SetGrayImg(self, img):
if img:
# unless other method of creating wx.Bitmap from gray cv image is found
# Here we create a color image by copying planes
img2 = cv.CreateImage(cv.GetSize(img), cv.IPL_DEPTH_8U, 3)
cv.Merge(img,img,img,None,img2)
self.SetColorImg(img2)
app = wx.App(False)
MyFrame(None, -1, 'wxPython Template')
app.MainLoop()
wxpython 总结例子

#!/usr/bin/python
# submenu.py
import wx
import os
# For each item that triggers an event, allocate one ID
# Maybe you want to differentiate menu, toolbar, and others event sources
ID_QUIT = 1
ID_NEW = 2
ID_TOOL_EXIT = 3
ID_STAT = 11
ID_TOOL = 13
ID_RADIO1 = 14
ID_RADIO2 = 15
ID_TOOL_ENABLE = 21
ID_TOOL_DISABLE = 22
#iconpath = r'/home/bee33/win/Basic_set_Png'
iconpath = r'G:\win\Basic_set_Png'
# Context menu
class MyPopupMenu(wx.Menu):
def __init__(self, parent):
wx.Menu.__init__(self)
self.parent = parent
minimize = wx.MenuItem(self, wx.NewId(), 'Minimize')
self.AppendItem(minimize)
self.Bind(wx.EVT_MENU, self.OnMinimize, id=minimize.GetId())
def OnMinimize(self, event):
self.parent.Iconize()
class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(400, 600))
# Set icon
icon = wx.EmptyIcon()
icon.CopyFromBitmap(wx.Bitmap(os.path.join(iconpath,'buy_16.png'), wx.BITMAP_TYPE_ANY))
self.SetIcon(icon)
# Menubar
menubar = wx.MenuBar()
# Menu 1
file = wx.Menu()
file.Append(ID_NEW, '&New', 'New in Statusbar')
file.Append(-1, '&Open')
file.Append(-1, '&Save')
file.AppendSeparator()
# Submenu of Menu 1. Note it is also wx.Menu
imp = wx.Menu()
imp.Append(-1, 'Import newsfeed list...')
imp.Append(-1, 'Import bookmarks...')
imp.Append(-1, 'Import mail...')
file.AppendMenu(-1, 'I&mport', imp)
quit = wx.MenuItem(file, ID_QUIT, '&Quit\tCtrl+W')
quit.SetBitmap(wx.Bitmap(os.path.join(iconpath,'left_16.png')))
file.AppendItem(quit)
# Menu 2
view = wx.Menu()
# 'Check' type Menu
self.shst = view.Append(ID_STAT, 'Show statubar', 'Show Statusbar', kind=wx.ITEM_CHECK)
self.shtl = view.Append(ID_TOOL, 'Show toolbar', 'Show Toolbar', kind=wx.ITEM_CHECK)
view.Check(ID_STAT, True)
view.Check(ID_TOOL, True)
# 'Radio' type Menu
self.radio1 = view.AppendRadioItem(ID_RADIO1, 'Show statubar', 'Show Statusbar')
self.radio2 = view.AppendRadioItem(ID_RADIO2, 'Hide statubar', 'Hide Statusbar')
# Finally, the end for menu parts
menubar.Append(file, '&File')
menubar.Append(view, '&View')
self.SetMenuBar(menubar)
# Toolbar
self.toolbar = self.CreateToolBar()
self.toolbar.AddLabelTool(ID_TOOL_EXIT, '', wx.Bitmap(os.path.join(iconpath,'left_16.png')))
self.toolbar.AddLabelTool(ID_TOOL_ENABLE, '', wx.Bitmap(os.path.join(iconpath,'tick_16.png')),longHelp='Enable Exit Tool')
self.toolbar.AddLabelTool(ID_TOOL_DISABLE, '', wx.Bitmap(os.path.join(iconpath,'delete_16.png')), shortHelp='Disable Exit Tool')
self.toolbar.Realize()
# Status bar
self.statusbar = self.CreateStatusBar()
########### Client Area #############
panel = wx.Panel(self, -1)
# it is void, only shows how to deal with background color
panel.SetBackgroundColour(panel.GetBackgroundColour())
######### Which sizer to use ############
# wx.BoxSizer: a row or a column. We can put another sizer into an existing sizer.
# wx.StaticBoxSizer: Identical to a wx.BoxSizer, with the one addition of a border (and optional
# caption) around the box.
# wx.GridSizer lays out widgets in two dimensional table.
# Each cell within the table has the same size.
# wx.FlexGridSizer: All cells in a row have the same height.
# All cells in a column have the same width.
# But all rows and columns are not necessarily the same height or width.
# box.Add(wx.Window window, integer proportion=0, integer flag = 0, integer border = 0)
# proportion: 0 - Do not change size
# it is relative, item with 2 changes twice the degree of item with 1
#
# Flag:
# wx.EXPAND: strech to the possible size
# wx.LEFT
# wx.RIGHT
# wx.BOTTOM
# wx.TOP
# wx.ALL: all the above are border margin flags
# wx.ALIGN_LEFT
# wx.ALIGN_RIGHT
# wx.ALIGN_TOP
# wx.ALIGN_BOTTOM
# wx.ALIGN_CENTER_VERTICAL
# wx.ALIGN_CENTER_HORIZONTAL
# wx.ALIGN_CENTER: the above are item alignment flags
# top sizer
vbox_top = wx.BoxSizer(wx.VERTICAL)
# Part 1 - Absolute positioning
pab = wx.Panel(panel, -1)
wx.TextCtrl(pab, -1, pos=(-1, -1), size=(250, 40))
# part2 - box sizer
# note that hbox is on the top of this part
hbox = wx.BoxSizer(wx.HORIZONTAL)
panel3 = wx.Panel(panel, -1)
panel3.SetBackgroundColour('#808080')
panel4 = wx.Panel(panel, -1)
panel4.SetBackgroundColour('#404040')
hbox.Add(panel3,1,wx.EXPAND|wx.ALL,5)
hbox.Add(panel4,2,wx.EXPAND|wx.ALL,5)
# part 3 - static box
sbox = wx.StaticBoxSizer(wx.StaticBox(panel, -1, 'Direction'), orient=wx.VERTICAL)
# take panel as its parent, rather than treat panel as a static box
sbox.Add(wx.RadioButton(panel, -1, 'Forward', style=wx.RB_GROUP))
sbox.Add(wx.RadioButton(panel, -1, 'Backward'))
# part 4 - grid
panel1 = wx.Panel(panel, -1)
grid1 = wx.GridSizer(2, 2)
grid1.Add(wx.StaticText(panel1, -1, 'Find: ', (5, 5)), 0, wx.ALIGN_CENTER_VERTICAL)
grid1.Add(wx.ComboBox(panel1, -1, size=(120, -1)))
grid1.Add(wx.StaticText(panel1, -1, 'Replace with: ', (5, 5)), 0, wx.ALIGN_CENTER_VERTICAL)
grid1.Add(wx.ComboBox(panel1, -1, size=(120, -1)))
panel1.SetSizer(grid1)
# part 5, image panel
self.panel5 = wx.Panel(panel, -1)
self.sbp = wx.StaticBitmap(self.panel5, -1, wx.Bitmap('../glove.jpg'))
# a sizer can add a panel or another sizer
vbox_top.Add(pab, 0, wx.EXPAND|wx.ALL, 5)
vbox_top.Add(hbox, 0, wx.EXPAND|wx.ALL, 5)
vbox_top.Add(sbox, 0, wx.EXPAND|wx.ALL, 5)
vbox_top.Add(panel1, 0, wx.EXPAND|wx.ALL, 5)
vbox_top.Add(self.panel5, 1, wx.EXPAND|wx.ALL, 5)
# set top sizer
panel.SetSizer(vbox_top)
# Show the frame
self.Centre()
self.Show(True)
########## Event binding ##############
# Menu events binding
self.Bind(wx.EVT_MENU, self.OnQuit, id=ID_QUIT)
self.Bind(wx.EVT_MENU, self.OnNew, id=ID_NEW)
self.Bind(wx.EVT_MENU, self.ToggleStatusBar, id=ID_STAT)
self.Bind(wx.EVT_MENU, self.ToggleToolBar, id=ID_TOOL)
# For radio menu events, their share the same handler
self.Bind(wx.EVT_MENU, self.ToggleRadio, id=ID_RADIO1)
self.Bind(wx.EVT_MENU, self.ToggleRadio, id=ID_RADIO2)
# Context Menu
self.sbp.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
# Tool events binding
self.Bind(wx.EVT_TOOL, self.OnToolExit, id=ID_TOOL_EXIT)
self.Bind(wx.EVT_TOOL, self.OnToolEnable, id=ID_TOOL_ENABLE)
self.Bind(wx.EVT_TOOL, self.OnToolDisable, id=ID_TOOL_DISABLE)
########## Event Handlers #############
def OnQuit(self, event):
self.Close()
def OnNew(self, event):
wx.MessageBox('New')
def ToggleStatusBar(self, event):
if self.shst.IsChecked():
self.statusbar.Show()
else:
self.statusbar.Hide()
def ToggleToolBar(self, event):
if self.shtl.IsChecked():
self.toolbar.Show()
else:
self.toolbar.Hide()
def ToggleRadio(self, event):
if self.radio1.IsChecked():
self.toolbar.Show()
if self.radio2.IsChecked():
self.toolbar.Hide()
def OnRightDown(self, event):
# self.sbp.GetPosition()
self.PopupMenu(MyPopupMenu(self), self.panel5.GetPosition()+event.GetPosition()+(0,5))
def OnToolExit(self, event):
self.Destroy()
def OnToolEnable(self, event):
self.toolbar.EnableTool(ID_TOOL_EXIT, True)
def OnToolDisable(self, event):
self.toolbar.EnableTool(ID_TOOL_EXIT, False)
app = wx.App(False)
MyFrame(None, -1, 'wxPython Template')
app.MainLoop()
0 comments:
Post a Comment