我在使用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.
我會改變的數據對象到逗號分隔的列表,或在它的逗號假一字符串逗號分隔列表。然後將該列表或字符串添加到ClipBoard –
@MikeD謝謝,我嘗試了逗號分隔,但是我仍然遇到了粘貼到Excel中的問題,但是我可以使用\ t替換爲無問題的粘貼到Excel中。我還注意到,在將文本添加到dataObj時,我使用的是SetData而不是SetText,這似乎是我多語言輸出的原因。 –
我很高興你明白了。 –