2017-11-14 24 views
2

私は現在、tkinterでドラッグアンドドロップを使用してボタンを移動しようとしています。 ボタンを移動しようとすると問題は起こりますが、親の外に移動することはできません: ボタン付きのLabelFrameがいくつかあります。私はLabelFrameから他のボタンにボタンをドラッグ&ドロップしようとしていますが、ボタンが親の外に出ると「消えます」。 ドラッグ中にウィジェットを移動するために、ウィジェットの「場所」メソッドを使用しています。tkinterで親の外にボタンを移動するには?

私の問題が本当に分かりやすいかどうかは分かりません。それをより良く説明しなければ、いくつかのコードを書いておきます。

+0

これを直接行うことはできません。ウィジェットは親が占める空間に限定されます。ウィジェットが親の端に触れ、それを別の親の内部に再描画するときを検出するコードを書くこともできますが、これは非常に簡単な方法を知っていない限り、このような小さなタスクには天文学的な量の作業が必要ですこの)。 –

+0

私は過去数週間にわたってTkinterとたくさん仕事をしていますが、あなたが求めているものが可能かどうかは分かりません。親は私が言うことのできるものから、本質的に子供を切り捨てます。私の仕事は「GUIHolder」クラスを作成し、それを使って系統(親/子供)を維持することでした。そうすれば、すべてのオブジェクトを直接親にルートすることができ、親の外に移動するように見えるようになります。 –

+1

[このガイド](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のより曖昧な側面の1つです。 –

関連する問題