【问题标题】:Unexpected characters appended at the end of text strings when using wx.TextDropTarget使用 wx.TextDropTarget 时在文本字符串末尾附加了意外字符
【发布时间】:2016-03-24 18:59:39
【问题描述】:

我正在使用 wx.TextDropTarget 实现一个拖放应用程序,用户可以在其中将一些文本字符串从ListCtrl 小部件拖放到TextCtrl 小部件中。我无法弄清楚如何解决的一个问题是,有时在TextCtrl 小部件中删除的文本字符串在末尾附加了随机字符(见下面的截图)。这个问题并不是每次都会出现——正如你所看到的,“伊甸之东”显示得很好。

我在 OSX 10.10.5 上并使用 wxPython 2.9.2.4-1。我不确定这个问题是否可以在其他平台上重现。示例代码如下。

import wx

from wx.lib.mixins.listctrl import ListCtrlAutoWidthMixin

class AutoWidthListCtrl(wx.ListCtrl, ListCtrlAutoWidthMixin):
    def __init__(self, parent):
        wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_REPORT)
        ListCtrlAutoWidthMixin.__init__(self)


class TextDropTarget(wx.TextDropTarget):
    def __init__(self, obj):
        wx.TextDropTarget.__init__(self)
        self.obj = obj

    def OnDropText(self, x, y, text):
        self.obj.WriteText(text)

    def OnDragOver(self, x, y, d):
        return wx.DragCopy


class MyApp(wx.Frame):
    def __init__(self, parent, title):
        super(MyApp, self).__init__(parent, style = wx.DEFAULT_FRAME_STYLE, 
                            title=title, size=(500, 500))
        self.Panel = wx.Panel(self, size = (-1, -1))
        GridBagSizer = wx.GridBagSizer(5,5)

        #ListCtrl widget 
        self.Source = AutoWidthListCtrl(self.Panel)
        self.Source.Show()
        self.Source.InsertColumn(0, 'Book Titles')
        self.Source.InsertStringItem(0,'War and Peace')
        self.Source.InsertStringItem(0,'East of Eden')
        self.Source.InsertStringItem(0,'Pride and Prejudice')

        GridBagSizer.Add(self.Source, pos = (0, 0), span = (6, 1), 
                         flag = wx.EXPAND|wx.ALL, border = 15)
        self.Panel.SetSizer(GridBagSizer)

        #Label for each TextCtrl widget
        AmericanNovel = wx.StaticText(self.Panel, label ="American Novel:")
        EnglishNovel = wx.StaticText(self.Panel, label = "British Novel:")
        RussianNovel = wx.StaticText(self.Panel, label = "Russian Novel:")      
        GridBagSizer.Add(AmericanNovel, pos = (0, 1), span = (1, 1), 
                         flag = wx.TOP, border = 10)
        GridBagSizer.Add(EnglishNovel, pos = (2, 1), span = (1, 1))
        GridBagSizer.Add(RussianNovel, pos = (4, 1), span = (1, 1))                      

        #TextCtrl widgets        
        self.Target1 = wx.TextCtrl(self.Panel, size = (240, -1), 
                                   style = wx.TE_READONLY)
        self.Target2 = wx.TextCtrl(self.Panel, size = (240, -1), 
                                   style = wx.TE_READONLY)
        self.Target3 = wx.TextCtrl(self.Panel, size = (240, -1), 
                                   style = wx.TE_READONLY)

        GridBagSizer.Add(self.Target1, pos = (1, 1), span = (1, 1))
        GridBagSizer.Add(self.Target2, pos = (3, 1), span = (1, 1))
        GridBagSizer.Add(self.Target3, pos = (5, 1), span = (1, 1))                      

        dt1 = TextDropTarget(self.Target1)
        dt2 = TextDropTarget(self.Target2)
        dt3 = TextDropTarget(self.Target3)
        self.Target1.SetDropTarget(dt1)
        self.Target2.SetDropTarget(dt2)
        self.Target3.SetDropTarget(dt3)

        self.Bind(wx.EVT_LIST_BEGIN_DRAG, self.OnDragInit)

        GridBagSizer.AddGrowableCol(0)
        GridBagSizer.AddGrowableCol(1)        


    def OnDragInit(self, evt):
        text = self.Source.GetItemText(evt.GetIndex())
        tdo = wx.TextDataObject(text)
        tds = wx.DropSource(self.Source)
        tds.SetData(tdo)
        tds.DoDragDrop(True)


if __name__ == "__main__":
    app = wx.App()
    MainFrame = MyApp(None, title = "My App")
    MainFrame.Show()
    MainFrame.Centre()
    app.MainLoop()

任何指针将不胜感激!

【问题讨论】:

  • 您确定您的机器上没有安装某种中文字符集。那些“流浪”字符看起来像是在翻译。只是一个想法!
  • 我的电脑可以显示中文,但是Mac OS是英文的,我没有安装任何专门的中文。也就是说,我的电脑可以开箱即用地显示中文

标签: python drag-and-drop wxpython


【解决方案1】:

您的代码可在 Linux 上运行。
我能看到的唯一与标准示例不同的是您的代码:

tdo = wx.TextDataObject(text)

应该是:

tdo = wx.PyTextDataObject(text)

不过,对于 Linux,这似乎无关紧要。

编辑: 首先,查看这个似乎相关的链接:
wx.PyTextDataObject with drag and drop results in extra characters

第二:
作为一种解决方法,请尝试在定义 text 后添加它

text = text.decode('iso-8859-1').encode('ascii', 'ignore')

这是一种删除无关字符的尝试。
您可以尝试将它们打印为原始字符串:

 print (repr(text))

【讨论】:

  • 嗯,将wx.TextDataObject改为wx.PyTextDataObject后,问题依旧。也许我应该在 Windows 机器上尝试一下,看看是否存在同样的问题,因为我实际上是为 Windows 制作的。
  • 仍然不起作用:-/ 但是,这个问题无法在我的 Windows 机器上重现。由于该应用程序是为 Windows 设计的,我想我现在可以忽略它。
猜你喜欢
  • 2021-12-16
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 2022-12-11
  • 2017-09-29
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
相关资源
最近更新 更多