2011-01-29 6 views
0

Tkinter 캔버스 위젯이 있는데 그 위에 점 무늬를 만들고 싶습니다. 나는 create_line 메서드를 사용하여 수동으로 처리 할 수 ​​있음을 알고 있습니다. 그러나, 나는 더 좋은 방법 인 것처럼 보일 것이라고 생각합니다. 어떤 도움이라도 대단히 감사 할 것입니다.Tkinter 캔버스 위젯을 꿰뚫는 가장 간단한 방법은 무엇입니까?

현재 작업하고있는 항목. (프로그램을 종료하려면 Alt-F4 키를 누르십시오)

import Tkinter, re 

class StippleCanvas(Tkinter.Tk): 
    def __init__(self, parent): 
     Tkinter.Tk.__init__(self, parent) 


     self.overrideredirect(1) 
     self.resizable(False,False) 
     self.wm_attributes("-topmost", 1) 
     self.attributes("-alpha", 0.9) 

     w = 90 
     h = 90 

     self.Ca = Tkinter.Canvas(self, width=w, height=h, highlightthickness=0, bd=0, bg='grey25') 
     self.Ca.grid(column=0, row=0) 
     self.bind('<Button-1>', self.relative_mouse_position) 
     self.bind('<ButtonRelease-1>', self.wid_unbind) 

     i0 = 0 
     while i0 < w: 
      i1 = 0 
      while i1 < h: 
       self.Ca.create_line(i1, i0, i1+1, i0, fill='grey20', width=1) 
       i1 = i1 + 2 
      i0 = i0 + 2 

    def geom_grab (self): 
     Cursorgfltr = re.compile(r"(\d+), (\d+)") 
     CursorPos = self.winfo_pointerxy() 
     CursorPosGr = Cursorgfltr.search(str(CursorPos)) 
     self.CursorX = int(CursorPosGr.group(1)) 
     self.CursorY = int(CursorPosGr.group(2)) 

     gfltr = re.compile(r"(\d+)?x?(\d+)?([+-])(\d+)([+-])(\d+)") 

     gf = gfltr.search(self.wm_geometry()) 
     self.X = int(gf.group(4)) 
     self.Y = int(gf.group(6)) 

    def relative_mouse_position (self, event): 
     self.geom_grab() 

     RelX = self.CursorX - self.X 
     RelY = self.CursorY - self.Y 

     self.Ca.bind("<Motion>", lambda event: self.wid_drag(event, RelX, RelY)) 

    def wid_drag (self, event, RelX, RelY): 


     self.geom_grab() 

     X = self.CursorX - RelX 
     Y = self.CursorY - RelY 

     if X < 0: 
      X = 0 

     if Y < 0: 
      Y = 0 

     self.wm_geometry('+' + str(X) + '+' + str(Y)) 


    def wid_unbind (self, event): 
     self.Ca.unbind("<Motion>") 

def run(): 
    StippleCanvas(None).mainloop() 
if __name__ == '__main__': 
    run() 

답변

0

가장 간단한 방법은 무엇입니까? 그것은 당신의 "단순한"정의에 달려 있습니다. 한 가지 방법은 드로잉 프로그램을 사용하여 배경에 대해 원하는 이미지를 만든 다음 캔버스에 배치하는 것입니다. 이것은 미리 캔버스의 크기를 알고 있다고 가정합니다. 하나의 이미지를 캔버스에 삽입하는 것보다 훨씬 간단합니다.

이 테마의 변형은 작은 타일을 만들고 tkinter의 이미지 처리를 사용하여 새 이미지에 바둑판 식으로 배열 된 원래 이미지로 적절한 크기의 새 이미지를 만드는 것입니다. 이 작업은 캔버스 크기를 조정할 때마다 수행 할 수 있습니다. 그들이 티클보다는 파이썬에서 비록 이것의 몇 가지 예는 다음 링크에서 볼 수있다 (파이썬으로 변환 그렇게하지 않는 매우 솔직하다 유령 당신) :

http://wiki.tcl.tk/4389

비록 , 솔직히 말해서, 당신이 한 일은 단순한 점에 대해서는 괜찮습니다. 점선 드로잉을 함수로 옮겨 캔버스의 크기가 바뀔 때마다 (즉 : <Configure> 이벤트가 발생했을 때) 다시 실행할 수 있습니다.

관련 문제