2016-03-24 1 views
0

Я использую wx.TextDropTarget реализовать перетаскивание приложения, где пользователи могут перетащить некоторые текстовые строки из ListCtrl виджета и поместите их в TextCtrl виджетов. Одна из проблем, с которыми я не мог понять, как решить, заключается в том, что иногда текстовые строки, сброшенные в TextCtrl, видят, что к ним добавляются случайные символы (см. Снимок экрана ниже). Эта проблема не возникает каждый раз - как вы можете видеть, «Восток от Эдема» отображается хорошо.Неожиданных символы прилагаемых в конце строки текста при использовании wx.TextDropTarget

enter image description here

Я на 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() 

Любой указатель будет очень благодарен!

+0

Вы уверены, что у вас нет какого-то китайского набора символов, установленного на вашем компьютере. Эти «бродячие» персонажи выглядят так, будто они забивают перевод. Просто мысль! –

+0

Мой компьютер может отображать китайский язык, но Mac OS на английском языке, и я не установил ничего особенного для китайцев. Другими словами, мой компьютер может отображать китайский язык из коробки – Alex

ответ

0

Ваш код работает в Linux.
Единственное, что я могу видеть, что отличается от стандартных примеров, ваш код:

tdo = wx.TextDataObject(text) 

должно быть:

tdo = wx.PyTextDataObject(text) 

хотя, с Linux это не кажется, важно.

EDIT: Во-первых, эта ссылка, которая, как представляется, связаны:
wx.PyTextDataObject with drag and drop results in extra characters

Второе:
В работе вокруг, попробуйте добавить это после определения text

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

Это попытайтесь удалить посторонние символы.
Вы можете попробовать печатать их в качестве сырья строки:

print (repr(text)) 
+0

Mmm, после изменения 'wx.TextDataObject' на' wx.PyTextDataObject' проблема все еще сохраняется. Может быть, я должен попробовать его на машине Windows, чтобы узнать, существует ли та же проблема, поскольку я делаю это для Windows. – Alex

+0

См. Мой отредактированный ответ –

+0

Все еще не работает: -/Однако эта проблема не может быть воспроизведена на моей Windows-машине. Поскольку приложение предназначено для Windows, я думаю, что сейчас я его не просмотрю. – Alex