【发布时间】: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