現在、canvasを使用して、複数の丸を書いております。
やりたい事は、ある処理が終わったら次のcanvasの色を変えたいと思ってます。
canvas1、canvas2、、canvas100と、100個同じ丸の図形を作りました。位置は別々なのですが、今回の質問と逸れますが他の方法があれば教えてください。それぞれ位置の違う100個の同じ丸の作り方について。
本題に入ります。その100個の丸を、
ある処理が終われば、canvas1の色を変え、次に、ある処理が終わればcanvas2の色が変わり、という感じで、canvas100まで同様な処理で色を変えたく思います。
処理は、tkinter内で、for文で回しており、canvasの数が少なければ、指定してconfigで変えれば良いですが、100個はさすがにコードを書くのは無理です。
そこで、変数の代入、exec、fomatなど使ってみて、文字列として、canvasの後ろの数値をfor文で変えて、その後、変数変換を試しましたが、色が変わりませんでした。
つきまして、canvas1からcanvas100を、うまく変数を変えながら、色変えする方法を教えてください。
また、canvas1からcanvas100を一括して、色変えの方法もあわせてご教示いただけないでしょうか?
そもそもcanvas1からcanvas100まで作らなくても、一括管理でき、かつ、各それぞれ、処理ごとに一個ずつ色変えする方法をご教示いただけないでしょうか?
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
tkinter内で、for文で回しており、canvasの数が少なければ、指定してconfigで変えれば良いですが、100個はさすがにコードを書くのは無理です。
mainloop 実行以降は、例えばイベントハンドラ内の関数内では
可能な限りループ文は避けたほうが良いです。
描画の更新は関数の実行が終わってからなので、
ループに時間がかかる場合は、GUI操作の遅延になることがあります。
どうしても描画の更新が必要な場合のみ、
ループ内で update_idletasks を呼び出して即時に描画を更新も出来ますが、
大抵の場合はタイマーを使って実装する方法をお勧めします。
そこで、変数の代入、exec、fomatなど使ってみて、文字列として、canvasの後ろの数値をfor文で変えて、その後、変数変換を試しましたが、色が変わりませんでした。
変数で管理するのではなく、描画する円に tag を付けて
itemconfigure で色等の情報を変更する方法があります。
補足追記: 個別の識別子としてタグを付けるのではなく、
同じ色の円に同じタグを付ける事で、そのタグがついてる円の色を一斉に変えることが出来ます。
投稿2020/12/08 12:32
編集2020/12/08 12:47総合スコア8738
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/09 07:45
2020/12/09 08:14 編集
2020/12/09 08:22
2020/12/09 08:23
2020/12/09 08:26
2020/12/09 08:29
2020/12/09 08:32
2020/12/09 08:36
2020/12/09 08:39
2020/12/09 08:42
0
ベストアンサー
コード投稿の為別投稿にて回答します。
キャンバスを複数作られてるようですが、
- 一つのキャンバス内に複数の円を描画
- タグは複数付けられるので、共通のタグをつければ一括変更も可
- タグの代わりに create_oval の戻り値、個別の円の識別に使えます。
python
1import tkinter as tk 2 3root = tk.Tk() 4canvas = tk.Canvas(root, width=800, height=600) 5canvas.pack(fill=tk.BOTH, expand=tk.YES) 6 7canvas.create_oval(100, 100, 200, 200, fill="black", tag=("circle", "c1")) 8canvas.create_oval(200, 100, 300, 200, fill="black", tag=("circle", "c2")) 9canvas.create_oval(300, 100, 400, 200, fill="black", tag=("circle", "c3")) 10 11def start_tasks(): 12 import time 13 for item in ["c1", "c2", "c3"]: 14 time.sleep(1) # XXX: 時間の掛かる処理。 15 # 動作デモの為、時間の掛かる処理の代わりとして time.sleep を使いますが、 16 # tkinter のイベントが処理されなくなるので、実際のアプリケーションでは使ってはいけない。 17 18 canvas.itemconfig(item, fill="green") # 色変更 19 canvas.update_idletasks() # 描画更新 20 21button1 = tk.Button(root, text="start tasks", command=start_tasks) 22button1.pack() 23 24def onclick(): 25 canvas.itemconfig("circle", fill="black") 26button2 = tk.Button(root, text="reset", command=onclick) 27button2.pack() 28 29root.mainloop()
投稿2020/12/09 09:06
総合スコア8738
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/09 10:59
2020/12/09 12:11
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。