2017-11-14 1 views
2

저는 현재 tkinter로 끌어서 놓기를 사용하여 버튼을 이동하려고합니다. 문제는 버튼을 이동하려고 할 때 작동하지만 부모 이외의 곳으로 이동할 수 없다는 것입니다. 버튼이있는 LabelFrame이 여러 개 있습니다. LabelFrame에서 다른 버튼으로 드래그 앤 드롭하려고하지만 버튼이 부모의 바깥 쪽을 벗어나면 "사라집니다". 드래그하는 동안 위젯의 "place"메소드를 사용하여 이동합니다.tkinter로 부모 밖에있는 버튼을 이동하는 방법?

내 문제가 실제로 이해할 수 있는지 확실하지 않습니다. 더 잘 설명하지 않는다면 몇 가지 코드를 넣을 것입니다.

+0

직접 할 수 없습니다. 위젯은 부모가 차지하는 공간에 갇혀 있습니다. 위젯이 부모 가장자리에 닿았을 때이를 다른 부모 내부로 다시 그려 넣는 것을 감지 할 수있는 코드를 작성할 수는 있습니다. 그러나 이렇게하면 작은 작업에 천문학적 인 작업량이 필요할 것입니다 (누군가가 믿을 수 없을만큼 쉬운 방법을 알지 못한다면 이). –

+0

저는 지난 몇 주 동안 Tkinter와 많은 일을 해왔습니다. 당신이 요구하는 것이 가능할 지 모르겠습니다. 부모는 내가 말할 수있는 것에서부터 본질적으로 아이들을 자릅니다. 내 해결 방법은 "GUIHolder"클래스를 만들고이를 사용하여 계보 (예 : 부모/자식)를 유지하는 것입니다. 그런 다음 모든 객체를 루트에 직접적으로 부모로 지정할 수 있으므로 부모가 아닌 외부로 이동하는 것처럼 보일 수 있습니다. –

+1

[this guide] (https://stackoverflow.com/help/mcve)에 따라 ** minimal **, ** complete ** 및 ** verifiable ** 예제를 제공 할 수있는 경우. 나는 * 할 수 * 시도하고 함께 할 방법을 보여주기 위해 뭔가를 넣어. –

답변

3

위젯은 계층 구조에 존재하며 모든 위젯은 부모에 의해 시각적으로 잘립니다. 위젯이 다른 시간에 다른 프레임에 나타나길 원하기 때문에, 위젯은 어느 프레임의 자식이 될 수 없습니다. 대신 프레임의 부모 자식으로 만듭니다. 그런 다음 (또는 pack 또는 grid)을 사용하여 in_ 매개 변수를 사용하여 위젯을 어느 프레임에 넣을 수 있습니다.

다음은 예입니다. 코드를 작게 유지하기 위해 드래그 앤 드롭을 사용하지 않지만 원리를 설명합니다. 한 프레임에서 다른 프레임으로 이동하려면 단추를 클릭하십시오.

import tkinter as tk 

class Example: 
    def __init__(self): 
     self.root = tk.Tk() 
     self.lf1 = tk.LabelFrame(self.root, text="Choose me!", width=200, height=200) 
     self.lf2 = tk.LabelFrame(self.root, text="No! Choose me!", width=200, height=200) 

     self.lf1.pack(side="left", fill="both", expand=True) 
     self.lf2.pack(side="right", fill="both", expand=True) 

     self.button = tk.Button(self.root, text="Click me", command=self.on_click) 
     self.button.place(in_=self.lf1, x=20, y=20) 

    def start(self): 
     self.root.mainloop() 

    def on_click(self): 
     current_frame = self.button.place_info().get("in") 
     new_frame = self.lf1 if current_frame == self.lf2 else self.lf2 
     self.button.place(in_=new_frame, x=20, y=20) 


Example().start() 
+0

답변 해 주셔서 감사합니다. 나에게 많은 도움이되고, in_ 파라미터를 알지 못했고, 내가 원하는 것을 만들기 위해 그것을 사용할 것입니다. – Stephie

+0

이것은 나에게도 뉴스입니다. 그건 정말 유용한 매개 변수처럼 보입니다 ... 실용적인 용도는'in_ '이 될지 궁금합니다. –

+1

@ Mike-SMT : 실제적인 사용은 더 많거나 적습니다. tcl/tk에서는 매우 자주 사용했지만 실제로 python/tkinter에서는 사용하지 않았습니다. 'in_'은 확실히 tkinter의 더 애매한 부분 중 하나입니다. –

관련 문제