2017-08-03 3 views
1

初めての投稿ですので、コミュニティに感謝したいと思います。私はあなたの経験のために今まで私自身の質問をする必要はなかった。ここでvariableという名前のpython tkinter canvasオブジェクトを作成し、このリンクを維持してオブジェクトを再構成する方法はありますか?

は私の質問です:

  • あなたは以下のexempleスクリプトを見れば、あなたは私がループを使用してTkinterのキャンバスでオブジェクトを作成することを参照してください。
  • 私は 'name'という名前の変数を作成し、値は 'objectx'です
  • この変数 'name'を使ってオブジェクト(ここではテキストオブジェクト)を描画しようとします。

これを実行すると、 'name'変数の値を使用して、オブジェクトの削除/設定/移動が可能になります。しかし、いいえ。私のオブジェクトは '名前'にリンクされたままであり、 'オブジェクトx'にはリンクされません。 Pythonは私を返す 'NameError:name' object2 'is not defined'

誰かが私にキャンバスオブジェクト間のリンクを構築し、それと対話するソリューションを知っていますか?

感謝

import tkinter as tk 

def popup(event): 
    print('Got object click', event.x, event.y) 
    print(event.widget.find_closest(event.x, event.y)) 
    lvl01 = tk.Toplevel(bd = 1, bg = 'black') 
    time.sleep(2) 
    print('2sec') 


if __name__ == '__main__': 

    root = tk.Tk() 

    can = tk.Canvas(root, width = 400, height = 400) 
    can.pack() 

    x = 0 
    while x < 10: 
     x = x + 1 
     name = "object" + str(x) 
     print(name) 
     name = can.create_text(x * 30, x * 30, text = 'hello') 

    can.delete(object2) 

答えて

1

あなたはobject2(または他の番号)という名前の変数をcan.create_textにバインドしていると思います。

あなたが実際にやっていることは、最初にnameという名前の変数を文字列 'object2'にバインドし、次にそれをcan.create_text呼び出しの戻り値に再バインドすることです。

あり、最初の結果を達成するために複数の方法があるが、名前で迅速なアクセスを可能にする。この場合には気にするスプリング1は、dictのようにようにすることです:

windows = {} 
x = 0 
while x < 10: 
    x = x + 1 
    name = "object" + str(x) 
    print(name) 
    windows[name] = can.create_text(x * 30, x * 30, text = 'hello') 

can.delete(windows[object2]) 
+0

ありがとうございました。どうもありがとう – Ceobanach

1

あなたはそのような変数名を作成することはできません。このコード:

name = "object" + str(x) 
name = can.create_text(x * 30, x * 30, text = 'hello') 

は、文字列を作成し、名前nameにそれを結合し、その後すぐにキャンバスのテキストオブジェクトのIDとそれを上書きします。

しかし、キャンバスのテキストオブジェクトを名前をキーとして辞書に格納することができます。

import tkinter as tk 

root = tk.Tk() 
can = tk.Canvas(root, width = 400, height = 400) 
can.pack() 

objects = {} 
for x in range(1, 11): 
    sx = str(x) 
    name = "object" + sx 
    print(name) 
    objects[name] = can.create_text(x * 30, x * 30, text = 'hello' + sx) 

can.delete(objects["object2"]) 
root.mainloop() 
+0

あなたがくれました同じ時に同じソリューションが、まだ良いものです。私が探していたものが – Ceobanach

関連する問題