2013-10-25 56 views
0

我在使用wxPython 2.9.5,ObjectListView 1.2,lxml 2.3和SQLAlchemy 0.8.2編寫Python 2.7.5的程序時遇到了困難,並將其編譯爲帶有py2exe的exe文件。wxPython ObjectListView捕獲Ctrl-C快捷方式

我遇到的問題是在將程序編譯爲exe後,我不再能夠使用Ctrl-C從ObjectListView複製數據並將其粘貼到其他程序(如Excel,記事本甚至Notepad ++)中。無論選擇多少行進行復制/粘貼,都會發生這種情況。粘貼到Excel中時得到的結果是「Microsoft Excel無法粘貼數據」。當我嘗試記事本時,我得到第一列和第一行的第一個字母(我認爲它是第一行),但沒有別的。

這裏是一個輸出窗口的代碼片段,我遇到了問題(總共有2個,但它們幾乎是彼此完美的鏡像)。這由主腳本導入,然後作爲頁面添加到agw AUI筆記本中。

import wx 
from ObjectListView import ObjectListView, ColumnDefn 
from wx.lib.pubsub import pub 
import ectworker as EW 

TabLabel = 'Primary Output' 
outputOne = [] 

class TabPanel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     headerFont = wx.Font(12, wx.MODERN, wx.SLANT, wx.NORMAL) 
     title = wx.StaticText(self, -1, " Primary Output:") 
     title.SetFont(headerFont) 

     self.countDisplay = wx.StaticText(self, -1, '%s'%len(invOutput)) 
     self.countDisplay.SetFont(headerFont) 

     self.dataOLV = ObjectListView(self, wx.ID_ANY, 
      style=wx.LC_REPORT|wx.SUNKEN_BORDER) 
     self.setColumns() 
     self.dataOLV.SetEmptyListMsg('Please click the show button.\n\ 
      If nothing appears then there is nothing to display') 
     self.dataOLV.cellEditMode = ObjectListView.CELLEDIT_NONE 

     updateBtn = wx.Button(self, wx.ID_ANY, 'Show') 
     updateBtn.Bind(wx.EVT_BUTTON, self.updateControl) 

     filterBtn = wx.Button(self, label='Filter') 
     filterBtn.Bind(wx.EVT_BUTTON, self.filterInfo) 

     lookupBtn = wx.Button(self, wx.ID_ANY, 'Look Up') 
     lookupBtn.Bind(wx.EVT_BUTTON, self.onLookUp) 

     vbox = wx.BoxSizer(wx.VERTICAL) 
     hbox0 = wx.BoxSizer(wx.HORIZONTAL) 
     hbox0.Add(title, 0, wx.ALL, 5) 
     hbox0.Add(self.countDisplay, 0, wx.ALL, 5) 
     hbox1 = wx.BoxSizer(wx.HORIZONTAL) 
     hbox1.Add(updateBtn, 0, wx.ALL, 5) 
     hbox1.Add(filterBtn, 0, wx.ALL, 5) 
     hbox1.Add(lookupBtn, 0, wx.ALL, 5) 
     vbox.Add(hbox0, 0, wx.EXPAND, 5) 
     vbox.Add(self.dataOLV, 1, wx.ALL|wx.EXPAND, 5) 
     vbox.Add(hbox1, 0, wx.ALL|wx.CENTER, 5) 
     self.SetSizer(vbox) 

    def setColumns(self, data=None): 
     self.idColumn = ColumnDefn('Dealer ID', 'left', -1, 'id') 
     self.nameColumn = ColumnDefn('Dealer Name', 'left', -1, 'name') 
     self.thirdColumn = ColumnDefn('Third', 'left', -1, 'third') 
     self.fourthColumn = ColumnDefn('Fourth', 'left', -1, 'fourth') 
     self.fifthColumn = ColumnDefn('Fifth', 'left', -1, 'fifth') 
     self.sixthColumn = ColumnDefn('Sixth', 'right', -1, 'sixth') 
     self.seventhColumn = ColumnDefn('Seventh', 'right', -1, 'seventh') 
     self.olvColumns = [ 
      self.idColumn, 
      self.nameColumn, 
      self.thirdColumn, 
      self.fourthColumn, 
      self.fifthColumn, 
      self.sixthColumn, 
      self.seventhColumn] 

     self.dataOLV.SetColumns(self.olvColumns) 

    def updateControl(self, event): 
     outputOne = EW.filterOne() 
     self.updateOLV(outputOne)   

    def filterInfo(self, event): 
     pub.sendMessage('dialog.filter', event=None) 
     while EW.dataVars.theFilter == []: 
      pub.sendMessage('dialog.filter', event=None) 
     outputOne = EW.filterOne() 
     self.updateOLV(outputOne) 

    def updateOLV(self, object): 
     self.dataOLV.SetObjects(object) 
     self.countDisplay.SetLabel('%s'%len(object)) 

    def onLookUp(self, event): 
     # This needs proper error handling 
     selectedRow = self.dataOLV.GetSelectedObject() 
     try: 
      webbrowser.open('sc/%s' % selectedRow.id) 
     except AttributeError: 
      pass 

if __name__ == '__main__': 
    print('File file is not meant to be run as a stand alone application.') 
    print(' Please try again by running the main program.') 

我的主要問題是如何獲得鍵盤快捷鍵Ctrl + C後編譯與py2exe後正常工作?

在我收到「Try PyInstaller」的回覆之前,我每次都會收到一條錯誤消息,但這是另一個可能的問題發佈。

在此先感謝。

- 編輯 -

我想這個代碼將是我的解決方案,但是我最終的結果是外語的一個混亂的混搭。

def onCtrlC(self, event): 
    selectedRows = self.dataOLV.GetSelectedObjects() 
    self.dataObj = wx.TextDataObject() 
    self.dataObj.SetData('%s'%str(selectedRows)) 
    if wx.TheClipboard.Open(): 
     wx.TheClipboard.SetData(self.dataObj) 
     wx.TheClipboard.Flush() 
    else: 
     pub.sendMessage('dialog.error', message='Unable to open the clipboard', 
         caption='Error') 

我在做一個有根據的猜測,我錯過了一些東西。

--EDIT2--

得到它的工作是需要的,這要歸功於邁克·德里斯科爾,謝謝! 我確實改變了我將數據放入剪貼板的方式,我不認爲它是最有效的,但它的工作原理。我也發現了爲什麼粘貼時我收到了混亂的混亂。代碼如下,我使用多行TextCtrl臨時存儲數據並在完成時清除它。

self.hiddenTxt = wx.TextCtrl(self, style=wx.TE_MULTILINE) 
self.hiddenTxt.Hide() 

def onCtrlC(self, event): 
    selectedRows = self.dataOLV.GetSelectedObjects() 
    for x in selectedRows: 
     self.hiddenTxt.AppendText('%s\t%s\n'%(x.id, x.name)) 
    self.dataObj = wx.TextDataObject() 
    self.dataObj.SetText(self.hiddenTxt.GetValue()) 
    if wx.TheClipboard.Open(): 
     wx.TheClipboard.SetData(self.dataObj) 
     wx.TheClipboard.Flush() 
    else: 
     pub.sendMessage('dialog.error', message='Unable to open the clipboard', 
         caption='Error') 
    self.hiddenTxt.SetValue('') 

我瘋玩上的部分是:

self.dataObj.SetData 

它實際上需要的是:

self.dataObj.SetText 

通過在每一行,我可以粘貼到使用花絮之間\ t Excel完全沒有問題!

很多,非常感謝您邁克D.

+0

我會改變的數據對象到逗號分隔的列表,或在它的逗號假一字符串逗號分隔列表。然後將該列表或字符串添加到ClipBoard –

+0

@MikeD謝謝,我嘗試了逗號分隔,但是我仍然遇到了粘貼到Excel中的問題,但是我可以使用\ t替換爲無問題的粘貼到Excel中。我還注意到,在將文本添加到dataObj時,我使用的是SetData而不是SetText,這似乎是我多語言輸出的原因。 –

+0

我很高興你明白了。 –

回答

1

您可能需要使用剪貼板明確,使這項工作。我不知道你爲什麼會,但這是我的第一個想法。以下是關於這個問題的一對夫婦教程:

我還要請在wxPython的用戶列表/谷歌組。很多開發商掛在那裏,也許能夠給你的其他建議:

+0

感謝您的快速回復,我一定會看看這些鏈接,並檢查wxPython用戶列表/ Google組。它只是讓我不知道爲什麼複製/粘貼通過Python作爲腳本運行時能夠正常工作,而不是在使用py2exe創建Windows exe後。我的第一個想法是,py2exe可能會歪曲事情。雖然我一定會考慮明確地使用剪貼板。有關「捕獲」Ctrl + C組合鍵並將其綁定到將複製到剪貼板的功能的建議? –

+0

是的,那很奇怪。我完全同意你的看法。至於捕捉組合鍵,我建議創建一個加速器表。我在這裏寫了關於這些:http://www.blog.pythonlibrary.org/2010/12/02/wxpython-keyboard-shortcuts-accelerators/ –

+0

我能夠使用加速表來捕獲Ctrl + C組合鍵,並從技術上將所選行的內容複製到系統剪貼板中。但是,粘貼這些數據會產生一些「奇怪」的結果。粘貼的數據是一個不協調的混亂。我已經將代碼添加到了我的原始問題中, –