2017-03-27 54 views
0

嘗試在保持文本位於同一位置的同時在屏幕上滾動圖形。該文本顯示了鼠標的位置。我想過在屏幕滾動的相反方向滾動文本的想法,但我不確定是否有更簡單的方法來做到這一點,如果我必須以相反的方式滾動文本,我不確定如何設置初始文本指針,以便我可以回來並重新調用/重置它。我只希望它表明立場,而不是在不久的將來會做其他事情。Python Tkinter在滾動屏幕上固定文本位置

class Example(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 

     self.keys = dict.fromkeys(('Left', 'Right', 'Up', 'Down')) 

     self.canvas = tk.Canvas(self, background="bisque", width=700, height=700) 
     self.canvas.pack(fill="both", expand=True) 
     self.canvas.configure(scrollregion=(-1000, -1000, 1000, 1000)) 

     self.looper() # start the looping 

    def keypress(self,event): 
     if event.keysym in self.keys: 
     # event type 2 is key down, type 3 is key up 
      self.keys[event.keysym] = event.type == '2' 

    def looper(self): 
     if self.keys['Up']: 
      self.canvas.yview_scroll(-2,'units') 
     if self.keys['Down']: 
      self.canvas.yview_scroll(2,'units') 
     if self.keys['Left']: 
      self.canvas.xview_scroll(-2,'units') 
     if self.keys['Right']: 
      self.canvas.xview_scroll(2,'units') 

     self.after(5, self.looper) # set the refresh rate here ... ie 20 milliseconds. Smaller number means faster scrolling 

    def on_press(self, event): 
     self.last_x = event.x 
     self.last_y = event.y 
     self.startx, self.starty = self.canvas.canvasx(event.x),self.canvas.canvasy(event.y) 

    def on_motion(self, event): 
     self.canvas.delete("sx") 
     self.startx, self.starty = self.canvas.canvasx(event.x),self.canvas.canvasy(event.y) 
     px = round(-(((1000-self.startx) * .00015) + 69.3),5) 
     py = round((45.05-((1000+self.starty) * .00015)),5) 
     self.canvas.create_text(400,-400, text = str(px), fill = "black", tags = "sx") 
     self.canvas.create_text(475,-400, text = str(py), fill = "black", tags = "sx") 

    def button_motion(self,event): 
     delta_x = event.x - self.last_x 
     delta_y = event.y - self.last_y 
     self.last_x = event.x 
     self.last_y = event.y 

     self.canvas.xview_scroll(-delta_x, "units") 
     self.canvas.yview_scroll(-delta_y, "units") 

if __name__ == "__main__": 
    root = tk.Tk() 
    Example(root).pack(fill="both", expand=True) 
    root.mainloop() 

回答

0

最簡單的解決方案是使用未嵌入在畫布上的文字一個小部件,使其不會滾動畫布上滾動時。創建一個Label,將其父項作爲畫布,然後使用place將標籤疊加在畫布上。