質問編集履歴

1

コードの修正

2020/05/14 04:46

投稿

tomo754
tomo754

スコア11

test CHANGED
File without changes
test CHANGED
@@ -4,9 +4,9 @@
4
4
 
5
5
 
6
6
 
7
- pythonにて任意の画像をCanvas内にグレースケールで表示させ、その画像の中心を70×70で切り出して、別に用意したCanvas2に2倍に拡大して表示させたい。
7
+ pythonにて任意の画像をCanvas内にグレースケールで表示させ、その画像の左上座標(20, 20, 70, 70)を50×50で切り出して、別に用意したCanvas2に2倍に拡大して表示させたい。
8
-
8
+
9
- コードを実行すると以下のエラーメッセージが発生ました。
9
+ しかし、コードを実行すると切り出した画像では無く、元画像が表示されている様子
10
10
 
11
11
  初心者で理解が浅く申し訳ありませんがご教授下さい。
12
12
 
@@ -16,17 +16,7 @@
16
16
 
17
17
 
18
18
 
19
- Traceback (most recent call last):
19
+
20
-
21
- File "C:\Users\0020215025\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 1699, in __call__
22
-
23
- return self.func(*args)
24
-
25
- File "c:/Users/0020215025/Documents/python_prg/動作確認.py", line 68, in button4_click
26
-
27
- clipped = image[180, 125, 230, 175]
28
-
29
- UnboundLocalError: local variable 'image' referenced before assignment
30
20
 
31
21
 
32
22
 
@@ -56,12 +46,6 @@
56
46
 
57
47
 
58
48
 
59
- def __init__(self, main):
60
-
61
- #ファイル削除処理
62
-
63
- self.file_del()
64
-
65
49
 
66
50
 
67
51
 
@@ -94,41 +78,31 @@
94
78
 
95
79
  #ファイルパスの表示欄を作成
96
80
 
97
- input_box1 = tk.Entry(width=75)
81
+ input_box1 = tk.Entry(width=75, bd=4)
98
82
 
99
83
  input_box1.place(x=80, y=40)
100
84
 
101
85
 
102
86
 
103
-
87
+ img = None #初期化
104
88
 
105
89
 
106
90
 
107
91
  #参照ボタンの動作
108
92
 
109
- def button1_clicked(self):
93
+ def file_select():
110
-
94
+
111
- #ファイルパスを取得
95
+ #ファイルパスを表示欄に表示
112
96
 
113
97
  idir = r'C:\descktop'
114
98
 
115
- filepath = tk.filedialog.askdirectory(initialdir = idir)
116
-
117
-
118
-
119
-
120
-
121
- def file_select():
122
-
123
- #ファイルパスを表示欄に表示
124
-
125
- idir = r'C:\descktop'
126
-
127
99
  filetype = [("すべて","*")]
128
100
 
129
101
  filepath = tk.filedialog.askopenfilename(filetypes = filetype, initialdir = idir)
130
102
 
103
+ input_box1.delete(0, tk.END)
104
+
131
- input_box1.insert(tk.END, filepath)
105
+ input_box1.insert(0, filepath)
132
106
 
133
107
  #選択したファイルを表示
134
108
 
@@ -136,6 +110,8 @@
136
110
 
137
111
  #PILで開きグレースケールに変換
138
112
 
113
+ global img #グローバル宣言
114
+
139
115
  img = Image.open(filepath).convert("L")
140
116
 
141
117
  image = ImageTk.PhotoImage(image=img)
@@ -150,51 +126,49 @@
150
126
 
151
127
 
152
128
 
153
- #画像をCanvas1に表示
129
+ #表示位置調整
154
130
 
155
131
  cv.image = image
156
132
 
133
+ cv.create_image(image.width()/2, image.height()/2, image=image)
134
+
135
+
136
+
137
+ #範囲表示ボタンの動作
138
+
139
+ def button3_click():
140
+
141
+ cv.create_rectangle([(20, 20), (70, 70)], outline = "red")#左上
142
+
143
+
144
+
145
+ #切り出しボタンの動作
146
+
147
+ def button4_click():
148
+
149
+ if img is not None: #値の確認
150
+
151
+ cropped_img = img.crop((20, 20, 70, 70))
152
+
153
+ #画像の情報を取得
154
+
155
+ h, w = cropped_img.size[:]
156
+
157
+ #画像リサイズ
158
+
159
+ cropped_img = ImageTk.PhotoImage(img.resize((int(h*2),int(w*2))))
160
+
157
161
 
158
162
 
159
163
  #表示位置調整
160
164
 
165
+ cv2.image = cropped_img
166
+
161
- cv.create_image(image.width()/2, image.height()/2, image=image)
167
+ cv2.create_image(cropped_img.width()/2, cropped_img.height()/2, image=cropped_img)
162
-
163
-
164
-
165
- #範囲表示ボタンの動作
166
-
167
- def button3_click():
168
-
169
- cv.create_rectangle([(180, 125), (230, 175)], outline = "red")#中央
170
-
171
-
172
-
173
- #切り出しボタンの動作
174
-
175
- def button4_click():
176
-
177
- clipped = image[180, 125, 230, 175]#矩形と同じサイズで切り出し
178
-
179
- #画像の情報を取得
180
-
181
- h, w = img.size[:]
182
-
183
- #画像リサイズ
184
-
185
- image = ImageTk.PhotoImage(img.resize((int(h*2),int(w*2))))
186
168
 
187
169
 
188
170
 
189
- #画像をCanvas1に表示
171
+
190
-
191
- cv2.image = image
192
-
193
-
194
-
195
- #表示位置調整
196
-
197
- cv2.create_image(image.width()/2, image.height()/2, image=image)
198
172
 
199
173
 
200
174
 
@@ -208,29 +182,41 @@
208
182
 
209
183
  #切り抜いた画像の表示
210
184
 
211
- #ラベル3を作成
185
+ #ラベル3を作成(左上画像)
212
-
186
+
213
- label3 = tk.Label(text='●中心画像')
187
+ label3 = tk.Label(text='●左上画像')
214
188
 
215
189
  label3.place(x=450, y=110)
216
190
 
217
191
 
218
192
 
219
- #Canvas2の作成
193
+ #Canvasの作成(左上画像)
220
-
194
+
221
- cv2 = tk.Canvas(win, width=140, height=140, bg="white",)
195
+ cv2 = tk.Canvas(win, width=100, height=100, bg="white",)
222
196
 
223
197
  cv2.place(x=450, y=130)
224
198
 
225
199
 
226
200
 
227
-
201
+ #ラベル4を作成(右上画像)
202
+
203
+ label4 = tk.Label(text='●右上画像')
204
+
205
+ label4.place(x=630, y=110)
206
+
207
+
208
+
209
+ #Canvasの作成(右上画像)
210
+
211
+ cv3 = tk.Canvas(win, width=100, height=100, bg="white",)
212
+
213
+ cv3.place(x=630, y=130)
228
214
 
229
215
 
230
216
 
231
217
  #参照ボタン1を作成
232
218
 
233
- button1 = tk.Button(text="参照", command=file_select, width=8)
219
+ button1 = tk.Button(text="参照", command=file_select, width=8, bd=4)
234
220
 
235
221
  button1.place(x=630, y=35)
236
222
 
@@ -238,7 +224,7 @@
238
224
 
239
225
  #閉じるボタンを作成
240
226
 
241
- button2 = tk.Button(text="閉じる", command=win.destroy, width=8)
227
+ button2 = tk.Button(text="閉じる", command=win.destroy, width=8, bd=4)
242
228
 
243
229
  button2.place(x=730, y=35)
244
230
 
@@ -246,7 +232,7 @@
246
232
 
247
233
  #切り出し範囲表示ボタンを作成
248
234
 
249
- button3 = tk.Button(text="範囲表示", command=button3_click, width=10)
235
+ button3 = tk.Button(text="範囲表示", command=button3_click, width=10, bd=4)
250
236
 
251
237
  button3.place(x=450, y=70)
252
238
 
@@ -254,13 +240,23 @@
254
240
 
255
241
  #切り出し動作ボタンを作成
256
242
 
257
- button4 = tk.Button(text="切り出し", command=button4_click, width=10)
243
+ button4 = tk.Button(text="切り出し", command=button4_click, width=10, bd=4)
258
244
 
259
245
  button4.place(x=540, y=70)
260
246
 
261
247
 
262
248
 
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
263
- #ウインドウ動かす
259
+ #GUIそのまま表示
264
260
 
265
261
  win.mainloop()
266
262
 
@@ -268,8 +264,6 @@
268
264
 
269
265
  ```
270
266
 
271
- ```
272
-
273
267
 
274
268
 
275
269
  ### 試したこと