2013-07-08 402 views
1

我创建了一个拖放程序,可以很好地处理一个小的美学问题。它通过选择列表框中的项目,将其转换为canvas.create_text,然后将其放到画布上。唯一的问题是,create_text在列表框下,我想知道如何使它出现在列表框的顶部。我试着改变初始化的顺序,看着提高/降低,但我没有看到任何改变。tkinter画布在框架

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 
+0

我不明白“create_text是在listbox下”的意思。当列表框和画布位于不重叠的窗口的两个独立部分时,它如何能在列表框下面? –

+0

当我点击列表框中的一个项目时,会在鼠标所在的位置(在列表框中)创建一个create_text,但列表框位于其上。我试图设置它,以便在create_text创建时显示在列表框的顶部 –

回答

1

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