2012-03-06 8 views
2

Tkinter에서 위젯 (특히 이미지)의 일관된 스택 순서를 유지할 수있는 방법이 있습니까? 예를 들어 캔버스의 동일한 위치에 두 개의 직사각형, 두 개의 삼각형 및 원이있을 수 있습니다. 마우스를 마지막으로 클릭 한 곳으로 원이 이동하지만 항상 사각형과 삼각형 뒤에 그려야합니다. 물론 기본 동작은 마지막에 그려진 객체를 맨 위의 주어진 위치에 배치하는 것입니다.Tkinter의 스태킹 순서 유지 보수

필자는 Tkinter의 스태킹을 해결하기 위해 lift() 및 lower() 메서드 만 발견했습니다. 나는 이론적으로 모든 재 드로잉마다 매끄러운 수표를 만들어 대상에 삼각형이 있는지 여부를 확인하고 원하는 모양이 될 때까지 각 셰이프에 대해 약간의 리프트()/하()를 수행합니다.하지만 이는 불합리한 해결책으로 보입니다. 캔버스 객체에 일종의 "레이어"변수가있을 것으로 기대하여 레이어 3의 항목이 항상 레이어 1의 항목 뒤에 있어야한다는 것을 수동적으로 기억합니다.

간단한 문제 해결 방법이 있으면 사과드립니다. , 그러나 아직 모든 나의 검색은 소용이 없다. 나는 어떤 의견에 감사 할 것이다!

답변

4

모든 삼각형에 "삼각형", 모든 사각형에 "사각형"및 모든 원에 "원"태그를 붙입니다. 그런 다음 lift 또는 lower 메서드를 사용하여 모든 삼각형, 원 또는 사각형을 한 번에 올리거나 내릴 수 있습니다. 몇 가지 진술이 필요하며 수천 개의 항목이 있더라도 눈 깜빡 할 사이에 일어날 것입니다.

내장 레이어 메커니즘에 대해 물었 기 때문에 : tk에는 그런 것은 없지만 실제로 추가하기 쉽습니다. 모든 도구가 있습니다. 따라서 lift 또는 lower 명령을 모든 곳에 뿌리지 말고 모든 도면을 특수한 명령으로 처리하여 레이어링을 처리하십시오.

def add_to_layer(self, layer, command, coords, **kwargs): 
    layer_tag = "layer %s" % layer 
    if layer_tag not in self._layers: self._layers.append(layer_tag) 
    tags = kwargs.setdefault("tags", []) 
    tags.append(layer_tag) 
    item_id = command(coords, **kwargs) 
    self._adjust_layers() 
    return item_id 

def _adjust_layers(self): 
    for layer in sorted(self._layers): 
     self.canvas.lift(layer) 

당신은 다음과 같이 호출합니다 : :

# draw a circle on layer 1: 
self.add_to_layer(1, self.canvas.create_oval, (x0,y0,x1,y1), outline="red") 
# draw a square on layer 2: 
self.add_to_layer(2, self.canvas.create_rectangle, (x0,y0,x1,y1), fill="blue") 

예를 들어, 다음은 레이어 번호를 받아 그립니다 반드시 모든 레이어에 만드는 명령의 예입니다

똑같은 것을 달성하는 다른 방법이 많이 있습니다. 위의 내용은 내 머리 꼭대기에서 빠르고 빠지기 만 한 예시입니다. (100 % 정확함을 보장하지는 않지만 요점을 설명합니다).

기본 아이디어는 모든 개체 생성이 항목이 만들어 질 때마다 겹침 순서를 조정할 수있는 단일 기능을 수행한다는 것입니다. 그렇게하면 승강/하강 명령을 한 위치에 추가하기 만하면됩니다.

+0

브라이언 감사합니다. 내 코드 전반에 걸쳐 이러한 진술을 분산시킬 필요가 없길 희망했지만 간단한 방법이없는 것처럼 보입니다. 도움에 감사드립니다! – Taugosz

+0

@Taugosz : 레이어링 시스템을 구현하는 데 필요한 모든 방법을 보여주기 위해 필자의 대답을 업데이트했습니다. 내장 된 것은 없지만 자신의 겹침을 구현하는 데는 약간의 상상력 만 필요합니다. –

+0

나는 일찍 그런 해결책을 생각해 내지 못했다. 나는 확실히 내가 필요한 도구들을 가지고 있었다. 귀하의 요점을 설명하기 위해 완전한 코드를 작성하는 데 시간을 할애 해 주셔서 감사드립니다. – Taugosz