質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

3641閲覧

python tkinter canvas ovalのサイズ変更について

Platycerium

総合スコア34

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/12/21 15:56

tkinterのcanvasに配置された円のサイズを、
スライダーから任意に変更できるようにしたく、コードを書きました。
色は赤から黄色に変更できるのですが、スライダーの値をサイズに反映する方法がわからず困っています。
どのようにしたら任意にサイズ変更ができるのでしょうか?

import tkinter as tk from tkinter import ttk window = tk.Tk() window.title('サンプル') frame1 = tk.Frame(window,bd=1,relief="ridge") frame1.grid(row=0, column=0,sticky='news') def point (value): ensize = int(float(value)) print(ensize) canvas.itemconfigure('en',fill="yellow") pointslider = tk.IntVar() ttk.Scale(frame1, from_=0, to_=100, length=200, variable=pointslider,command=point).pack() canvas = tk.Canvas(frame1, height=500, width=500, bg='white',bd=1,relief="ridge") canvas.pack() canvas.create_oval(250-3, 250-3, 250+3, 250+3,fill='red',tag="en") canvas.create_oval(250-3, 300-3, 250+3, 300+3,fill='red',tag="en") canvas.create_oval(400-3, 400-3, 400+3, 400+3,fill='red',tag="en") window.mainloop()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

.coordsで図形の座標を更新できます。
提示コードではすべての円に同じタグ名がつけられているためか、最初の円のみ更新されることに注意ください。

Python

1# 略 2def point (value): 3 ensize = int(float(value)) 4 print(ensize) 5 canvas.itemconfigure('en',fill="yellow") 6 canvas.coords('en',250-ensize, 250-ensize, 250+ensize, 250+ensize) # 各円の大きさを変えたい場合は`タグ名を別々につける必要あり 7# 略

投稿2018/12/21 16:16

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Platycerium

2018/12/22 05:45

回答ありがとうございました。 いつも迅速に返答いただき感謝しています。 全ての円を同時に変化させる方法をKSwordOfHasteさん から回答いただきましたのでこちらを参考とさせていただきました。
guest

0

ベストアンサー

Tkinerのとあるリファレンスページを見てみると
http://effbot.org/tkinterbook/canvas.htm#Tkinter.Canvas.coords-method

*coords: Optional list of coordinate pairs. If given, the coordinates will replace the current coordinates for all matching items.

と書いてあって、tag名を指定すればあたかも該当する全てのアイテムの座標が変化するかのように読めますがじっさいはcan110さんの回答にあるようにどれか一つしか変化しないようですね。もっとも全部のアイテムに同じ座標を指定できたとしても嬉しくないのですが・・・

もしTcl/Tkのovalアイテムに「中心座標」「大きさ」のそれぞれの属性がサポートされていたなら大きさの方だけitemconfigureで変更するようなことができたのかも知れません。しかしどうもそうは設計されておらず、can110さん回答のようにcoordsメソッドで左上、右下の座標を全部指定して変更することしかできないようです。(Tkinterのリファレンスを少し見てそう思いました)

そこでリファレンスに乗っているメソッドを組み合わせて複数のovalの半径だけを変更することを考えると

  • (A)特定のタグのitemを全て求める
  • (B)個々のitemの現在の座標(位置と大きさ)を求める
  • (C)個々のitemの新たな座標を計算し再設定

(A)はfind_withtagメソッドで(B),(C)はともにcoordsで可能みたいです。

ということで次のように書けそうです。

Python

1...省略... 2 3def point(value): 4 radius = float(value) # Tcl/Tkの座標はfloatでよく、必ずしもintにしなくてよい 5 for item in canvas.find_withtag('en'): 6 # 現在の座標を取得 7 xy = canvas.coords(item) 8 # 中心の座標を計算 9 cx, cy = (xy[2] + xy[0]) / 2, (xy[3] + xy[1]) / 2 10 # 新たな座標を設定 11 canvas.coords(item, cx - radius, cy - radius, cx + radius, cy + radius) 12 canvas.itemconfigure('en', fill="yellow")

TkinterはTcl/Tkのラッパーライブラリーのためか詳しい仕様はTcl/Tkの方をわかって作ってくださいといっている節があり両方の仕様を調べないとなかなか全貌がわからないかも知れません。ただ少なくともTkinterのリファレンスページをあれこれ見ていると「こんな機能がある」というのはそこそこわかりますのでそれを組み合わせて機能を実装することを考えてみてもよいのではないでしょうか?

投稿2018/12/22 05:01

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Platycerium

2018/12/22 05:41

思い通りの動きができました。 非常にわかりやすい解説で勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問