2017-03-25 1 views
0

나는 오늘 아침에 놀고있는 기본 프로그램을 가지고 있는데, 나는 몇 년 전에 다시 썼다. 그것은 단지 수평 스크롤과 줌을 가졌습니다. 나는 그것을 얻을 수 있었고 그래서 나는 한 번에 한 축을 스크롤하고 두 축을 확대 할 수 있었다. 나는 화면에서 x와 y 방향으로 동시에 움직일 수있게 해주는 프로그램을 만들고 싶다. (구글 어스와 같이 아래쪽과 왼쪽의 키를 동시에 눌러서 왼쪽 아래로 움직일 수있다.). 화면에 스크롤 막대가 없어도이를 수행하는 것이 좋습니다. 나는 그 축에서 스크롤 할 수 있기 위해 앞뒤로 가고 적절한 스크롤 바를 클릭하기를 원하지 않는다. 현재 스크롤하고있는 축을 변경하려면 반대 축을 클릭해야합니다.Tkinter 'scrollbar'로 가능

[http://www.tkdocs.com/tutorial/canvas.html#scrolling][1]에서 프로그램을 시도했지만 이미 그 기능을 수행했습니다. 그것은 두 방향을 동시에 스크롤 할 수 없으며 반대 방향 축을 클릭하지 않고 스크롤 할 방향을 변경하려는 경우 허용되지 않습니다.

내가 Tkinter로하려는 일을하는 방법이 있습니까? 그렇지 않으면 내가 다른 곳에서 봐야합니까?

감사합니다.

편집 : 난 단지 마우스 대 키보드와 두 작품을 얻기 위해 시도하는 다음 코드를 추가 아래 브라이언 게시 코드와

. 커서 키를 사용하여 마우스를 대고 이미지를 움직일 수 있기를 바랍니다. 나는이 컴퓨터에서 천천히 민감한 마우스를 가지고 있으며, 그 자신의 마음을 가지고 있고 결과적으로 나는 키보드를 고수하고 싶다. 게다가,이 프로젝트의 성격 때문에 모든 옵션을 열어 두어야합니다. 그렇지 않으면이 전체 프로젝트가 끝나기 전에 언젠가는 후회할 것입니다.

self.canvas.bind("<Left>", self.on_press) 
self.canvas.bind("<Right>", self.on_press) 

또한 self.on_motion으로 보내려고했지만 둘 다 커서 키를 사용하지 않았습니다.

+0

세계의 진정한 비밀은 가시가 아닌 보이지 않는 - 오스카 와일드. (여전히 신비한 코드를 제외하고) – stark

+0

달성하고자하는 것이 가능하다면 sligthest 아이디어가 없을 때 코드를 추가하기가 다소 어렵습니다 ... 어디서부터 시작해야할지 모릅니다 . – confused

답변

2

예, 가능합니다. 캔버스 xviewyview 메서드를 원하는 인수로 직접 호출 할 수 없습니다.

먼저 마우스의 클릭 및 동작을 추적하는 바인딩을 만들어야합니다. 바운드 함수에서 마우스가 이동 한 방향을 계산 한 다음 결과를 사용하여 위젯의 xviewyview 메서드를 동시에 호출 할 수 있습니다.

다음은 예입니다 :

import tkinter as tk 
import random 

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

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

     self.canvas.bind("<ButtonPress-1>", self.on_press) 
     self.canvas.bind("<B1-Motion>", self.on_motion) 

     # the following two values cause the canvas to scroll 
     # one pixel at a time 
     self.canvas.configure(xscrollincrement=1, yscrollincrement=1) 

     # finally, draw something on the canvas so we can watch it move 
     for i in range(1000): 
      x = random.randint(-1000, 1000) 
      y = random.randint(-1000, 1000) 
      color = random.choice(("red", "orange", "green", "blue", "violet")) 
      self.canvas.create_oval(x, y, x+20, y+20, fill=color) 

    def on_press(self, event): 
     self.last_x = event.x 
     self.last_y = event.y 

    def on_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

위의 코드를 편집 해 주셔서 감사합니다. .. 키보드만으로 가능합니까? 지금 당장 마우스를 놔두고 이미지를 옮기기 위해 키보드를 사용해야한다는 것을 충분히 알고 있다고 생각합니다. – confused

+0

@ confused : 물론 가능합니다. 원하는 모든 입력 매커니즘을 사용하여 수행 할 수 있습니다. 원하는 방법을 사용하여 각 방향으로 이동하는 정도를 계산하면됩니다. 질문을 크게 편집하는 것은 좋은 생각이 아닙니다. 부분적인 대답으로 완벽하게 유효하고 수용 가능한 대답을 만들기 때문입니다. –