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

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

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

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

Q&A

解決済

1回答

3491閲覧

python tkinter canvas テキストのズームについて

Platycerium

総合スコア34

Python 3.x

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

0グッド

0クリップ

投稿2018/12/14 14:38

pythonでキャンバス上に図形(円)とテキストを表示して、マウスホールで拡大縮小を行えるコードを書きました。
拡大操作で全体的にサイズは調整できるのですが、文字の大きさが、図形のように変化してくれません。
拡大すると小さく、縮小すると大きくなる気がします。

文字も図形と同じようにサイズ調整することは可能でしょうか?

import tkinter as tk def zoomer(event): if (event.delta > 0): canvas.scale("all", 0, 0, 1.1, 1.1) elif (event.delta < 0): canvas.scale("all", 0, 0, 0.9, 0.9) canvas.configure(scrollregion = canvas.bbox("all")) window = tk.Tk() window.title('サンプル') frame2 = tk.Frame(window,bd=1,relief="ridge") frame2.grid(row=2, column=0,sticky='news') canvas = tk.Canvas(frame2, height=500, width=500, bg='white',bd=1,relief="ridge") canvas.grid(row=0, column=0,sticky='news') canvas.create_oval(250-3, 250-3, 250+3, 250+3,fill='red',tag="en") canvas.create_text(250, 250-8,text="1",tag="bangou",fill='red') canvas.create_oval(250-3, 300-3, 250+3, 300+3,fill='red',tag="en") canvas.create_text(250, 300-8,text="2",tag="bangou",fill='red') canvas.create_oval(400-3, 400-3, 400+3, 400+3,fill='red',tag="en") canvas.create_text(400, 400-8,text="2",tag="bangou",fill='red') canvas.bind("<MouseWheel>",zoomer) frame2.grid_columnconfigure(0,weight=1) frame2.grid_rowconfigure(0,weight=1) window.grid_columnconfigure(0,weight=1) window.grid_rowconfigure(2,weight=1) window.mainloop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

「tkinter canvas scale」で検索してみたところstackoverflowに同様の質問が見つかります。

https://stackoverflow.com/questions/33795411/tkinter-scaling-items-on-a-canvas

その回答にあるようにTkinterのドキュメントにscaleメソッドはtextの位置だけに影響しtextの(フォントの)サイズには影響しないと書いてあります。

This method will not change the size of a text item, but may move it.

回答で提案している方法は「自前でitemconfigureメソッドによりフォントサイズを調整する」というものでしたので以下のようにやってみました。Tkinter(あるいはTcl/Tk)の制約のためフォントのサイズは整数のみに制限されているようでしたので、本当に望むサイズをfloatで管理しつつ実際にitemconfigureに指定するフォントのサイズは整数化してます。実際に動かしてみるとそこそこそれらしく振舞ってくれるようでした。

Python

1import tkinter as tk 2 3 4# @@@: フォントサイズの管理用に定義してます 5class FontSizer: 6 def __init__(self, name='TkDefaultFont', size=12): 7 self.name = name 8 self.size = size 9 10 def scale(self, sf): 11 self.size *= sf 12 13 @property 14 def font(self): 15 return self.name, int(self.size) 16 17 18def zoomer(event): 19 sf = 1.1 if event.delta > 0 else 0.9 # @@@ 20 canvas.scale("all", 0, 0, sf, sf) # @@@ 21 font_sizer.scale(sf) # @@@ 22 canvas.itemconfigure('bangou', font=font_sizer.font) # @@@ 23 canvas.configure(scrollregion=canvas.bbox("all")) 24 25 26window = tk.Tk() 27window.title('サンプル') 28 29frame2 = tk.Frame(window, bd=1, relief="ridge") 30frame2.grid(row=2, column=0, sticky='news') 31 32canvas = tk.Canvas(frame2, height=500, width=500, bg='white', bd=1, relief="ridge") 33canvas.grid(row=0, column=0, sticky='news') 34 35canvas.create_oval(250-3, 250-3, 250+3, 250+3, fill='red', tag="en") 36canvas.create_text(250, 250-8, text="1", tag="bangou", fill='red') 37 38... 省略 ... 39 40font_sizer = FontSizer(size=12) # @@@ 41canvas.itemconfigure('bangou', font=font_sizer.font) # @@@ 42canvas.bind("<MouseWheel>", zoomer) 43 44 45frame2.grid_columnconfigure(0, weight=1) 46frame2.grid_rowconfigure(0, weight=1) 47window.grid_columnconfigure(0, weight=1) 48window.grid_rowconfigure(2, weight=1) 49 50window.mainloop()

なお上記実装はちょっとさぼっている点があり、Tkinterのデフォルトのフォント名を'TkDefaultFont'であると仮定してます。これは自分の環境で実際にfontを指定せずにtextを生成し、canvas.itemcget('bangou', 'font')として得た結果から調べただけであって、実際にそういう仕様かどうか確認したわけではありません。そういう意味でポータビリティーに問題があるかも知れません。

投稿2018/12/15 00:36

編集2018/12/15 00:39
KSwordOfHaste

総合スコア18392

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

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

Platycerium

2018/12/15 00:55

多い通りの動きができるようになりました。 ありがとうございました。
Platycerium

2018/12/15 01:59

大変恐縮ですが、追加で1つ質問があります。 拡大や縮小をした後に、一番最初のサイズに図形やフォントサイズを戻すことは可能でしょうか?
KSwordOfHaste

2018/12/15 02:22

それはそれで本件とは別の観点での検討が必要と思いますので別途新たな質問を挙げることをお勧めします。
Platycerium

2018/12/15 03:24

ご回答ありがとうございました。 新たに質問をあげることにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問