+++ /dev/null
-"""
-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()