0

wxPython 2.9.5、ObjectListView 1.2、lxml 2.3、および SQLAlchemy 0.8.2 を使用して Python 2.7.5 で記述し、py2exe で exe にコンパイルしたプログラムに問題があります。

私が遭遇している問題は、プログラムを exe にコンパイルした後、Ctrl-C を使用して ObjectListView からデータをコピーし、Excel、メモ帳、さらにはメモ帳 ++ などの他のプログラムに貼り付けられなくなったことです。これは、コピー/貼り付け対象として選択された行数に関係なく発生します。Excel に貼り付けると、「Microsoft Excel はデータを貼り付けられません」という結果が表示されます。メモ帳を試してみると、最初の列と行 (最初の行だと思います) から最初の文字を取得しますが、他には何もありません。

これは、私が問題を抱えている出力ウィンドウの 1 つからのコード スニペットです (合計 2 つですが、互いにほぼ完全なミラーです)。これはメイン スクリプトによってインポートされ、agw AUI Notebook にページとして追加されます。

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.')

私の主な質問は、py2exe でコンパイルした後、キーボード ショートカット Ctrl+C を適切に機能させるにはどうすればよいかということです。

「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--

Mike Driscoll のおかげで、思いどおりに動作しました。ありがとう! データをクリップボードに入れる方法を変更しました。最も効率的ではないと思いますが、機能します。また、貼り付け時にごちゃまぜになった理由も発見しました。コードは以下のとおりです。複数行の 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 さん、ありがとうございました。

4

1 に答える 1

1

これを機能させるには、クリップボードを明示的に使用する必要がある場合があります。なぜそう思うのかはわかりませんが、それが私の最初の考えです。以下に、このテーマに関するチュートリアルをいくつか示します。

また、wxPython ユーザー リスト / Google グループでも質問します。多くの開発者がそこにたむろしており、追加のポインターを提供できる場合があります。

于 2013-10-25T17:42:03.123 に答える