回答編集履歴

2

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

2020/09/08 05:28

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -28,15 +28,13 @@
28
28
 
29
29
  ```python
30
30
 
31
-
32
-
33
31
  import tkinter as tk
34
32
 
35
33
 
36
34
 
37
35
  def resized(e):
38
36
 
39
- cv = e.widget # <-- bind 対象は win ではなく canvas
37
+ canvas = e.widget # <-- bind 対象は win ではなく canvas
40
38
 
41
39
  column = 3
42
40
 
@@ -52,17 +50,25 @@
52
50
 
53
51
  # キャンバスサイズを元に計算する。
54
52
 
55
- width = cv.winfo_width()
53
+ canvas_width = canvas.winfo_width()
56
54
 
57
- height = cv.winfo_height()
55
+ canvas_height = canvas.winfo_height()
56
+
57
+
58
+
59
+ # 等間隔に分割する際の、セルの縦横幅
60
+
61
+ cell_width = canvas_width // column
62
+
63
+ cell_height = canvas_height // row
58
64
 
59
65
 
60
66
 
61
- cv.delete("oval")
67
+ canvas.delete("oval")
62
68
 
63
- for x in range(width//column//2, width, width//column):
69
+ for x in range(cell_width//2, canvas_width, cell_width):
64
70
 
65
- for y in range(height//row//2, height, height//row):
71
+ for y in range(cell_height//2, canvas_height, cell_height):
66
72
 
67
73
  x1, x2 = x-r, x+r
68
74
 
@@ -70,7 +76,7 @@
70
76
 
71
77
 
72
78
 
73
- cv.create_oval(x1, y1, x2, y2, tag="oval", fill="red", outline="blue", width=5)
79
+ canvas.create_oval(x1, y1, x2, y2, tag="oval", fill="red", outline="blue", width=5)
74
80
 
75
81
 
76
82
 
@@ -84,15 +90,13 @@
84
90
 
85
91
 
86
92
 
87
- cv = tk.Canvas(win)
93
+ canvas = tk.Canvas(win)
88
94
 
89
- cv.grid(row=0, column=0, sticky="nsew")
95
+ canvas.grid(row=0, column=0, sticky="nsew")
90
96
 
91
- cv.bind("<Configure>", resized) # <-- win.bind ではなく canvas のイベントにする
97
+ canvas.bind("<Configure>", resized) # <-- win.bind ではなく canvas のイベントにする
92
98
 
93
99
  win.mainloop()
94
-
95
-
96
100
 
97
101
  ```
98
102
 

1

コードを追加

2020/09/08 05:27

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -26,6 +26,80 @@
26
26
 
27
27
 
28
28
 
29
+ ```python
30
+
31
+
32
+
33
+ import tkinter as tk
34
+
35
+
36
+
37
+ def resized(e):
38
+
39
+ cv = e.widget # <-- bind 対象は win ではなく canvas
40
+
41
+ column = 3
42
+
43
+ row = 2
44
+
45
+ r = 50
46
+
47
+
48
+
49
+ # 他のウィジェットを表示する時、
50
+
51
+ # ウィンドウサイズとキャンバスのサイズは一致しないことがあるので、
52
+
53
+ # キャンバスサイズを元に計算する。
54
+
55
+ width = cv.winfo_width()
56
+
57
+ height = cv.winfo_height()
58
+
59
+
60
+
61
+ cv.delete("oval")
62
+
63
+ for x in range(width//column//2, width, width//column):
64
+
65
+ for y in range(height//row//2, height, height//row):
66
+
67
+ x1, x2 = x-r, x+r
68
+
69
+ y1, y2 = y-r, y+r
70
+
71
+
72
+
73
+ cv.create_oval(x1, y1, x2, y2, tag="oval", fill="red", outline="blue", width=5)
74
+
75
+
76
+
77
+ if __name__ == '__main__':
78
+
79
+ win = tk.Tk()
80
+
81
+ win.rowconfigure(0, weight=1)
82
+
83
+ win.columnconfigure(0, weight=1)
84
+
85
+
86
+
87
+ cv = tk.Canvas(win)
88
+
89
+ cv.grid(row=0, column=0, sticky="nsew")
90
+
91
+ cv.bind("<Configure>", resized) # <-- win.bind ではなく canvas のイベントにする
92
+
93
+ win.mainloop()
94
+
95
+
96
+
97
+ ```
98
+
99
+
100
+
101
+
102
+
29
103
  ----
30
104
 
31
105
  尚、tk.Tk() 直下で所得してるウィンドウのサイズですが、