teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

コードの修正、変数名の整理

2020/09/08 05:28

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -13,11 +13,10 @@
13
13
 
14
14
 
15
15
  ```python
16
-
17
16
  import tkinter as tk
18
17
 
19
18
  def resized(e):
20
- cv = e.widget # <-- bind 対象は win ではなく canvas
19
+ canvas = e.widget # <-- bind 対象は win ではなく canvas
21
20
  column = 3
22
21
  row = 2
23
22
  r = 50
@@ -25,27 +24,30 @@
25
24
  # 他のウィジェットを表示する時、
26
25
  # ウィンドウサイズとキャンバスのサイズは一致しないことがあるので、
27
26
  # キャンバスサイズを元に計算する。
28
- width = cv.winfo_width()
27
+ canvas_width = canvas.winfo_width()
29
- height = cv.winfo_height()
28
+ canvas_height = canvas.winfo_height()
29
+
30
+ # 等間隔に分割する際の、セルの縦横幅
31
+ cell_width = canvas_width // column
32
+ cell_height = canvas_height // row
30
33
 
31
- cv.delete("oval")
34
+ canvas.delete("oval")
32
- for x in range(width//column//2, width, width//column):
35
+ for x in range(cell_width//2, canvas_width, cell_width):
33
- for y in range(height//row//2, height, height//row):
36
+ for y in range(cell_height//2, canvas_height, cell_height):
34
37
  x1, x2 = x-r, x+r
35
38
  y1, y2 = y-r, y+r
36
39
 
37
- cv.create_oval(x1, y1, x2, y2, tag="oval", fill="red", outline="blue", width=5)
40
+ canvas.create_oval(x1, y1, x2, y2, tag="oval", fill="red", outline="blue", width=5)
38
41
 
39
42
  if __name__ == '__main__':
40
43
  win = tk.Tk()
41
44
  win.rowconfigure(0, weight=1)
42
45
  win.columnconfigure(0, weight=1)
43
46
 
44
- cv = tk.Canvas(win)
47
+ canvas = tk.Canvas(win)
45
- cv.grid(row=0, column=0, sticky="nsew")
48
+ canvas.grid(row=0, column=0, sticky="nsew")
46
- cv.bind("<Configure>", resized) # <-- win.bind ではなく canvas のイベントにする
49
+ canvas.bind("<Configure>", resized) # <-- win.bind ではなく canvas のイベントにする
47
50
  win.mainloop()
48
-
49
51
  ```
50
52
 
51
53
 

1

コードを追加

2020/09/08 05:27

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -12,6 +12,43 @@
12
12
  他の円の座標も求まります。(range関数が使えます)
13
13
 
14
14
 
15
+ ```python
16
+
17
+ import tkinter as tk
18
+
19
+ def resized(e):
20
+ cv = e.widget # <-- bind 対象は win ではなく canvas
21
+ column = 3
22
+ row = 2
23
+ r = 50
24
+
25
+ # 他のウィジェットを表示する時、
26
+ # ウィンドウサイズとキャンバスのサイズは一致しないことがあるので、
27
+ # キャンバスサイズを元に計算する。
28
+ width = cv.winfo_width()
29
+ height = cv.winfo_height()
30
+
31
+ cv.delete("oval")
32
+ for x in range(width//column//2, width, width//column):
33
+ for y in range(height//row//2, height, height//row):
34
+ x1, x2 = x-r, x+r
35
+ y1, y2 = y-r, y+r
36
+
37
+ cv.create_oval(x1, y1, x2, y2, tag="oval", fill="red", outline="blue", width=5)
38
+
39
+ if __name__ == '__main__':
40
+ win = tk.Tk()
41
+ win.rowconfigure(0, weight=1)
42
+ win.columnconfigure(0, weight=1)
43
+
44
+ cv = tk.Canvas(win)
45
+ cv.grid(row=0, column=0, sticky="nsew")
46
+ cv.bind("<Configure>", resized) # <-- win.bind ではなく canvas のイベントにする
47
+ win.mainloop()
48
+
49
+ ```
50
+
51
+
15
52
  ----
16
53
  尚、tk.Tk() 直下で所得してるウィンドウのサイズですが、
17
54
  初期化時の円の描画は意図通りになってません。