Added the sample code from wxPython In Action to the samples dir
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42925 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
152
wxPython/samples/wxPIA_book/Chapter-18/customcomposite.py
Normal file
152
wxPython/samples/wxPIA_book/Chapter-18/customcomposite.py
Normal file
@@ -0,0 +1,152 @@
|
||||
"""
|
||||
This sample shows how to put multiple objects in the clipboard, one of
|
||||
which uses a custom data format. In this case we use a Python
|
||||
dictionary of values for our custom format, and we also put a textual
|
||||
representation of the dictionary. To test this, run two instances of
|
||||
this program, enter data in one and click the copy button. Then click
|
||||
the paste button in the other instance. Also paste into a text editor
|
||||
to see the data in the standard text format.
|
||||
"""
|
||||
|
||||
|
||||
import wx
|
||||
import cPickle
|
||||
import pprint
|
||||
|
||||
class TestFrame(wx.Frame):
|
||||
def __init__(self):
|
||||
wx.Frame.__init__(self, None, -1, "Copy/Paste Test")
|
||||
panel = wx.Panel(self)
|
||||
|
||||
# First create the controls
|
||||
topLbl = wx.StaticText(panel, -1, "Account Information")
|
||||
topLbl.SetFont(wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD))
|
||||
|
||||
nameLbl = wx.StaticText(panel, -1, "Name:")
|
||||
self.name = wx.TextCtrl(panel, -1, "");
|
||||
|
||||
addrLbl = wx.StaticText(panel, -1, "Address:")
|
||||
self.addr1 = wx.TextCtrl(panel, -1, "");
|
||||
self.addr2 = wx.TextCtrl(panel, -1, "");
|
||||
|
||||
cstLbl = wx.StaticText(panel, -1, "City, State, Zip:")
|
||||
self.city = wx.TextCtrl(panel, -1, "", size=(150,-1));
|
||||
self.state = wx.TextCtrl(panel, -1, "", size=(50,-1));
|
||||
self.zip = wx.TextCtrl(panel, -1, "", size=(70,-1));
|
||||
|
||||
phoneLbl = wx.StaticText(panel, -1, "Phone:")
|
||||
self.phone = wx.TextCtrl(panel, -1, "");
|
||||
|
||||
emailLbl = wx.StaticText(panel, -1, "Email:")
|
||||
self.email = wx.TextCtrl(panel, -1, "");
|
||||
|
||||
copyBtn = wx.Button(panel, -1, "Copy")
|
||||
pasteBtn = wx.Button(panel, -1, "Paste")
|
||||
self.Bind(wx.EVT_BUTTON, self.OnCopy, copyBtn)
|
||||
self.Bind(wx.EVT_BUTTON, self.OnPaste, pasteBtn)
|
||||
|
||||
# Now do the layout.
|
||||
|
||||
# mainSizer is the top-level one that manages everything
|
||||
mainSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
mainSizer.Add(topLbl, 0, wx.ALL, 5)
|
||||
mainSizer.Add(wx.StaticLine(panel), 0,
|
||||
wx.EXPAND|wx.TOP|wx.BOTTOM, 5)
|
||||
|
||||
# addrSizer is a grid that holds all of the address info
|
||||
addrSizer = wx.FlexGridSizer(cols=2, hgap=5, vgap=5)
|
||||
addrSizer.AddGrowableCol(1)
|
||||
addrSizer.Add(nameLbl, 0,
|
||||
wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL)
|
||||
addrSizer.Add(self.name, 0, wx.EXPAND)
|
||||
addrSizer.Add(addrLbl, 0,
|
||||
wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL)
|
||||
addrSizer.Add(self.addr1, 0, wx.EXPAND)
|
||||
addrSizer.Add((10,10)) # some empty space
|
||||
addrSizer.Add(self.addr2, 0, wx.EXPAND)
|
||||
|
||||
addrSizer.Add(cstLbl, 0,
|
||||
wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL)
|
||||
|
||||
# the city, state, zip fields are in a sub-sizer
|
||||
cstSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
cstSizer.Add(self.city, 1)
|
||||
cstSizer.Add(self.state, 0, wx.LEFT|wx.RIGHT, 5)
|
||||
cstSizer.Add(self.zip)
|
||||
addrSizer.Add(cstSizer, 0, wx.EXPAND)
|
||||
|
||||
addrSizer.Add(phoneLbl, 0,
|
||||
wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL)
|
||||
addrSizer.Add(self.phone, 0, wx.EXPAND)
|
||||
addrSizer.Add(emailLbl, 0,
|
||||
wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL)
|
||||
addrSizer.Add(self.email, 0, wx.EXPAND)
|
||||
|
||||
# now add the addrSizer to the mainSizer
|
||||
mainSizer.Add(addrSizer, 0, wx.EXPAND|wx.ALL, 10)
|
||||
|
||||
# The buttons sizer will put them in a row with resizeable
|
||||
# gaps between and on either side of the buttons
|
||||
btnSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
btnSizer.Add((20,20), 1)
|
||||
btnSizer.Add(copyBtn)
|
||||
btnSizer.Add((20,20), 1)
|
||||
btnSizer.Add(pasteBtn)
|
||||
btnSizer.Add((20,20), 1)
|
||||
|
||||
mainSizer.Add(btnSizer, 0, wx.EXPAND|wx.BOTTOM, 10)
|
||||
|
||||
panel.SetSizer(mainSizer)
|
||||
|
||||
# Fit the frame to the needs of the sizer. The frame will
|
||||
# automatically resize the panel as needed. Also prevent the
|
||||
# frame from getting smaller than this size.
|
||||
mainSizer.Fit(self)
|
||||
self.SetMinSize(self.GetSize())
|
||||
|
||||
|
||||
fieldNames = ["name", "addr1", "addr2",
|
||||
"city", "state", "zip", "phone", "email"]
|
||||
|
||||
def OnCopy(self, evt):
|
||||
# make a dictionary of values
|
||||
fieldData = {}
|
||||
for name in self.fieldNames:
|
||||
tc = getattr(self, name)
|
||||
fieldData[name] = tc.GetValue()
|
||||
|
||||
# pickle it and put in a custom data object
|
||||
cdo = wx.CustomDataObject("ContactDictFormat")
|
||||
cdo.SetData(cPickle.dumps(fieldData))
|
||||
|
||||
# also make a text representaion
|
||||
tdo = wx.TextDataObject(pprint.pformat(fieldData))
|
||||
|
||||
# and put them both in the clipboard
|
||||
dataobj = wx.DataObjectComposite()
|
||||
dataobj.Add(cdo)
|
||||
dataobj.Add(tdo)
|
||||
if wx.TheClipboard.Open():
|
||||
wx.TheClipboard.SetData(dataobj)
|
||||
wx.TheClipboard.Close()
|
||||
|
||||
|
||||
def OnPaste(self, evt):
|
||||
# Get the custom format object and put it into
|
||||
# the entry fields
|
||||
cdo = wx.CustomDataObject("ContactDictFormat")
|
||||
if wx.TheClipboard.Open():
|
||||
success = wx.TheClipboard.GetData(cdo)
|
||||
wx.TheClipboard.Close()
|
||||
if success:
|
||||
data = cdo.GetData()
|
||||
fieldData = cPickle.loads(data)
|
||||
for name in self.fieldNames:
|
||||
tc = getattr(self, name)
|
||||
tc.SetValue(fieldData[name])
|
||||
|
||||
|
||||
|
||||
app = wx.PySimpleApp()
|
||||
TestFrame().Show()
|
||||
app.MainLoop()
|
Reference in New Issue
Block a user