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

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

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

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

Q&A

解決済

1回答

9090閲覧

python tkinter canvas 拡大縮小について

Platycerium

総合スコア34

Python 3.x

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

0グッド

0クリップ

投稿2018/12/15 03:42

pythonでキャンバス上に円とテキストを配置を行い、マウスホイールで拡大縮小を行えるコードを作成しました。
拡大縮小の動作を行ったあとで、ボタンを押すと初期値のサイズに戻したいのですが、どのようにしたら良いでしょうか?

import tkinter as tk class FontSizer: def __init__(self, name='TkDefaultFont', size=12): self.name = name self.size = size def scale(self, sf): self.size *= sf @property def font(self): return self.name, int(self.size) def zoomer(event): global font_sizer sf = 1.1 if event.delta > 0 else 0.9 canvas.scale("all", 0, 0, sf, sf) font_sizer.scale(sf) canvas.itemconfigure('bangou', font=font_sizer.font) canvas.configure(scrollregion=canvas.bbox("all")) def shoki_size(): pass#初期のサイズに復元したい window = tk.Tk() window.title('サンプル') frame1 = tk.Frame(window,bd=1,relief="ridge") frame1.grid(row=1, column=0,sticky='news') btn = tk.Button(frame1, text="元のサイズに戻す",command=shoki_size) btn.grid(row=0, column=0,sticky="NEWS") 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') font_sizer = FontSizer(size=12) canvas.itemconfigure('bangou', font=font_sizer.font) 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

ベストアンサー

拡大・縮小時、率の逆数を保持しておけば、初期状態に戻すことができます。

Python

1import tkinter as tk 2 3class FontSizer: 4 def __init__(self, name='TkDefaultFont', size=12): 5 self.name = name 6 self.size = size 7 8 def scale(self, sf): 9 self.size *= sf 10 11 @property 12 def font(self): 13 return self.name, int(self.size) 14 15def zoomer(event): 16 global font_sizer 17 sf = 1.1 if event.delta > 0 else 0.9 18 19 # 元に戻せるように逆数を保持 20 global ini_size 21 ini_size = ini_size / sf 22 23 canvas.scale("all", 0, 0, sf, sf) 24 font_sizer.scale(sf) 25 canvas.itemconfigure('bangou', font=font_sizer.font) 26 canvas.configure(scrollregion=canvas.bbox("all")) 27 28def shoki_size(): 29 global font_sizer 30 global ini_size 31 canvas.scale("all", 0, 0, ini_size, ini_size) 32 font_sizer.scale(ini_size) 33 canvas.itemconfigure('bangou', font=font_sizer.font) 34 canvas.configure(scrollregion=(0,0,500,500)) # 初期スクロール位置。適当に戻す 35 36 ini_size = 1 37 38 39window = tk.Tk() 40window.title('サンプル') 41 42frame1 = tk.Frame(window,bd=1,relief="ridge") 43frame1.grid(row=1, column=0,sticky='news') 44 45btn = tk.Button(frame1, text="元のサイズに戻す",command=shoki_size) 46btn.grid(row=0, column=0,sticky="NEWS") 47 48frame2 = tk.Frame(window,bd=1,relief="ridge") 49frame2.grid(row=2, column=0,sticky='news') 50 51canvas = tk.Canvas(frame2, height=500, width=500, bg='white',bd=1,relief="ridge") 52canvas.grid(row=0, column=0,sticky='news') 53 54 55canvas.create_oval(250-3, 250-3, 250+3, 250+3,fill='red',tag="en") 56canvas.create_text(250, 250-8,text="1",tag="bangou",fill='red') 57 58canvas.create_oval(250-3, 300-3, 250+3, 300+3,fill='red',tag="en") 59canvas.create_text(250, 300-8,text="2",tag="bangou",fill='red') 60 61canvas.create_oval(400-3, 400-3, 400+3, 400+3,fill='red',tag="en") 62canvas.create_text(400, 400-8,text="2",tag="bangou",fill='red') 63 64 65font_sizer = FontSizer(size=12) 66canvas.itemconfigure('bangou', font=font_sizer.font) 67canvas.bind("<MouseWheel>", zoomer) 68 69ini_size = 1 # 初期倍率 70 71 72frame2.grid_columnconfigure(0,weight=1) 73frame2.grid_rowconfigure(0,weight=1) 74window.grid_columnconfigure(0,weight=1) 75window.grid_rowconfigure(2,weight=1) 76 77window.mainloop()

投稿2018/12/17 06:47

can110

総合スコア38262

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

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

Platycerium

2018/12/17 07:59

思い通りの動きが出来ました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問