Canvas 框架上的帆布

Canvas 框架上的帆布,canvas,listbox,tkinter,Canvas,Listbox,Tkinter,我创建了一个拖放程序,可以很好地处理一个小的美学问题。它的工作原理是在列表框中选择一个项目,将其转换为canvas.create_文本,然后将其放到画布上。唯一的问题是create_文本在列表框下,我想知道如何使它显示在列表框的顶部。我尝试过更改初始化顺序,并查看了raise/lower,但没有看到任何更改 def body(self, master): self.list = Listbox(master, width=26, height=10) self.list.grid

我创建了一个拖放程序,可以很好地处理一个小的美学问题。它的工作原理是在列表框中选择一个项目,将其转换为canvas.create_文本,然后将其放到画布上。唯一的问题是create_文本在列表框下,我想知道如何使它显示在列表框的顶部。我尝试过更改初始化顺序,并查看了raise/lower,但没有看到任何更改

def body(self, master):
    self.list = Listbox(master, width=26, height=10)
    self.list.grid(row=0, column=1)
    self.canvas = Canvas(master, width=350, height=500)
    self.canvas.grid(row=0, column=0)
    for j in self.items:
        self.list.insert(END, j)
    self.list.bind("<ButtonPress-1>", self.onPress)
    self.list.bind("<ButtonRelease-1>", self.onRelease)
    self.list.bind("<B1-Motion>", self.onMotion)

def onPress(self, event):
    '''Being drag of an object'''
    # record the item and its location
    w = event.widget
    index = w.nearest(event.y)
    name = self.list.get(index)
    t = self.canvas.create_text(event.x+350, event.y+90, text=name.replace(' ', '\n'),justify=CENTER, tags='sweden')
    self.dragData["item"] = t
    self.dragData["x"] = event.x
    self.dragData["y"] = event.y
    self.list.delete(index)

def onMotion(self, event):
    '''Handle dragging of an object'''
    # compute how much this object has moved
    deltaX = event.x - self.dragData["x"]
    deltaY = event.y - self.dragData["y"]
    # move the object the appropriate amount
    self.canvas.move(self.dragData["item"], deltaX, deltaY)
    # record the new position
    self.dragData["x"] = event.x
    self.dragData["y"] = event.y

def onRelease(self, event):
    '''End drag of an object'''
    # reset the drag information
    wx, wy = self.canvas.winfo_rootx(), self.canvas.winfo_rooty()
    x,y = self.winfo_pointerxy()
    cx = self.canvas.canvasx(x-wx)
    cy = self.canvas.canvasy(y-wy)
    #Rest of the release code
def主体(自身、主):
self.list=Listbox(主控,宽度=26,高度=10)
self.list.grid(行=0,列=1)
self.canvas=canvas(母版,宽度=350,高度=500)
self.canvas.grid(行=0,列=0)
对于self.items中的j:
self.list.insert(结束,j)
self.list.bind(“,self.onPress)
self.list.bind(“,self.onRelease)
self.list.bind(“,self.onMotion)
def onPress(自身,事件):
“正在拖动对象”
#记录项目及其位置
w=事件.widget
索引=w.最近(事件y)
name=self.list.get(索引)
t=self.canvas.create_text(event.x+350,event.y+90,text=name.replace('',\n'),justify=CENTER,tags='sweden'))
self.dragData[“项”]=t
self.dragData[“x”]=event.x
self.dragData[“y”]=event.y
self.list.delete(索引)
def onMotion(自身、事件):
''处理对象的拖动''
#计算此对象移动了多少
deltaX=event.x-self.dragData[“x”]
deltaY=event.y-self.dragData[“y”]
#将对象移动适当的量
self.canvas.move(self.dragData[“项”]、deltaX、deltaY)
#记录新位置
self.dragData[“x”]=event.x
self.dragData[“y”]=event.y
def onRelease(自我、事件):
''对象的结束拖动''
#重置拖动信息
wx,wy=self.canvas.winfo_rootx(),self.canvas.winfo_rooty()
x、 y=self.winfo_pointerxy()
cx=self.canvas.canvasx(x-wx)
cy=self.canvas.canvasy(y-wy)
#发布代码的其余部分

不,您不能在画布上创建文本,而是将其显示在其他窗口的上方。通常,对于拖放操作,您需要创建一个顶层窗口,并将OverrideDirect标志设置为充当被拖动对象的代理

否,您不能在画布上创建文本,而是将其显示在其他窗口的上方。通常,对于拖放操作,您需要创建一个顶层窗口,并将OverrideDirect标志设置为充当被拖动对象的代理

我不明白“列表框下的创建文本”是什么意思。当listbox和canvas位于窗口的两个不重叠的独立部分时,它怎么可能位于listbox下?当我单击listbox中的项目时,会在鼠标所在的位置(在listbox中)创建一个create_文本,但listbox位于其上。我正在尝试设置它,以便在创建create_文本时,它会显示在列表框的顶部。我不明白“create_文本在列表框下”是什么意思。当listbox和canvas位于窗口的两个不重叠的独立部分时,它怎么可能位于listbox下?当我单击listbox中的项目时,会在鼠标所在的位置(在listbox中)创建一个create_文本,但listbox位于其上。我正在尝试设置它,以便在创建create_文本时,它会显示在列表框的顶部