customcomposite.py

来自「wxPython的基本示例程序」· Python 代码 · 共 153 行

PY
153
字号
"""This sample shows how to put multiple objects in the clipboard, one ofwhich uses a custom data format.  In this case we use a Pythondictionary of values for our custom format, and we also put a textualrepresentation of the dictionary.  To test this, run two instances ofthis program, enter data in one and click the copy button.  Then clickthe paste button in the other instance.  Also paste into a text editorto see the data in the standard text format."""import wximport cPickleimport pprintclass 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()

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?