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

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

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

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

2005閲覧

python tkinter canvasから画像がはみ出てしまい一部しか表示されません

yuu2424

総合スコア13

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/11/23 05:45

編集2019/11/23 05:48

pythonの勉強中なのですが画像トリムのプログラムを作成中なのですが
どうしてもcanvasから画像がはみ出てしまいます。
どうしたらcanvas内に画像が収まるのでしょうか
ソースコードは下記のとうりです。
from tkinter import *
from PIL import Image, ImageTk

root = Tk()
root.geometry('1150x700')
def filenameMaker(num):
return "%03d.png" % num

class MainWindow():
def init(self, main):
main.title('picture')
画像を表示するキャンバスを作る
self.canvas = Canvas(main, width=900, height=500)
self.canvas.grid(row=0, column=0, columnspan=2, rowspan=4)

画像(000.pngから004.pngの5枚)を取り込む self.my_images = [] self.file_num = 0 for i in range(0, 5): self.my_images.append(ImageTk.PhotoImage(file=filenameMaker(i))) self.my_image_number = 0 保存用の番号を確保 self.save_file_num = 0 最初の画像をセット self.image_on_canvas = self.canvas.create_image(0, 0, anchor=NW, image=self.my_images[self.my_image_number]) 各種ボタンを作る 次の画像を表示するボタン self.button_next = Button(main, text="Next", command=self.onNextButton, width=10, height=5) self.button_next.place(x=10, y=600) 前の画像を表示するボタン self.button_back = Button(main, text="Back", command=self.onBackButton, width=10) self.button_back.place(x=10, y=670) 選択領域を保存するボタン self.button_save = Button(main, text="Save", command=self.onSaveButton, width=25, height=5) self.button_save.place(x=150, y=600) 保存用番号を一つ戻るボタン self.button_saveb = Button(main, text="Save Back", command=self.onSavebButton, width=25) self.button_saveb.place(x=150, y=670) メッセージを表示するEntryを作る 現在の画像番号を表示するEntry self.message_num = Entry(width=50) self.message_num.insert(END, ("This image is " + filenameMaker(self.my_image_number))) self.message_num.place(x=410, y=630) 次の保存番号を表示するEntry self.message = Entry(width=50) self.message.insert(END, ("Next_save-name_is_" + "save-" + filenameMaker(self.save_file_num))) self.message.place(x=410, y=670) スライダ用の変数を確保 self.left = 0 self.right = 0 self.top = 0 self.bottom = 0 画像切り出し用のラインをキャンバスに描画 self.canvas.create_line(self.left, 0, self.left, 900, tag="left_line", fill='green') self.canvas.create_line(self.right, 0, self.right, 900, tag="right_line", fill='red') self.canvas.create_line(0, self.top, 500, self.top, tag="top_line", fill='green') self.canvas.create_line(0, self.bottom, 500, self.bottom, tag="bottom_line", fill='red') 画像切り出し用のスライダを作る self.left = Scale(main, label='left', orient='h', from_=0, to=900, length=900, command=self.onSliderLeft) self.left.place(x=10, y=575) self.right = Scale(main, label='right', orient='h', from_=0, to=900, length=900, command=self.onSliderRight) self.right.place(x=10, y=520) self.top = Scale(main, label='top', orient='v', from_=0, to=500, length=500, command=self.onSliderTop) self.top.place(x=950, y=10) self.bottom = Scale(main, label='bottom', orient='v', from_=0, to=500, length=500, command=self.onSliderBottom) self.bottom.place(x=1030, y=10) 画像切り出し用のラインを表示している画像に合わせて移動 self.left.set(0) self.right.set(self.my_images[self.my_image_number].width()) self.top.set(0) self.bottom.set(self.my_images[self.my_image_number].height()) def onBackButton(self): 最後の画像に戻る if self.my_image_number == 0: self.my_image_number = len(self.my_images) - 1 else: 一つ戻る self.my_image_number -= 1 表示画像を更新 self.canvas.itemconfig(self.image_on_canvas, image=self.my_images[self.my_image_number]) 表示画像にあわせて画像切り出し用のラインの位置を更新 self.left.set(0) self.right.set(self.my_images[self.my_image_number].width()) self.top.set(0) self.bottom.set(self.my_images[self.my_image_number].height()) Entry(現在)の中身を更新 self.message_num.delete(0, END) self.message_num.insert(END, ("This image is " + filenameMaker(self.my_image_number))) Entry(保存)の中身を更新 self.message.delete(0, END) self.message.insert(END, ("Next_save-name_is_" + filenameMaker(self.my_image_number))) def onNextButton(self): 一つ進む self.my_image_number += 1 最初の画像に戻る if self.my_image_number == len(self.my_images): self.my_image_number = 0 表示画像を更新 self.canvas.itemconfig(self.image_on_canvas, image=self.my_images[self.my_image_number]) 表示画像にあわせて画像切り出し用のラインの位置を更新 self.left.set(0) self.right.set(self.my_images[self.my_image_number].width()) self.top.set(0) self.bottom.set(self.my_images[self.my_image_number].height()) Entry(現在)の中身を更新 self.message_num.delete(0, END) self.message_num.insert(END, ("This image is " + filenameMaker(self.my_image_number))) Entry(保存)の中身を更新 self.message.delete(0, END) self.message.insert(END, ("Next_save-name_is_" + filenameMaker(self.my_image_number))) def onSaveButton(self): 表示画像を取り込み self.temp_image = Image.open(filenameMaker(self.my_image_number)) 選択位置で切り出し self.cropped_image = self.temp_image.crop((self.left.get(), self.top.get(), self.right.get(), self.bottom.get())) 保存 self.cropped_image.save("save-" + filenameMaker(self.save_file_num)) self.save_file_num += 1 Entry(現在)の中身を更新 self.message_num.delete(0, END) self.message_num.insert(END, ("This image is " + filenameMaker(self.my_image_number))) Entry(保存)の中身を更新 self.message.delete(0, END) self.message.insert(END, ("Next_save-name_is_" + filenameMaker(self.my_image_number))) def onSavebButton(self): self.save_file_num -= 1 if self.save_file_num == -1: self.save_file_num = 0 Entry(現在)の中身を更新 self.message_num.delete(0, END) self.message_num.insert(END, ("This image is " + filenameMaker(self.my_image_number))) Entry(保存)の中身を更新 self.message.delete(0, END) self.message.insert(END, ("Next_save-name_is_" + filenameMaker(self.my_image_number))) def onSliderLeft(self, args): change line self.canvas.delete("left_line") self.canvas.create_line(self.left.get(), 0, self.left.get(), 500, tag="left_line", fill='green') def onSliderRight(self, args): change line self.canvas.delete("right_line") self.canvas.create_line(self.right.get(), 0, self.right.get(), 500, tag="right_line", fill='red') def onSliderTop(self, args): change line self.canvas.delete("top_line") self.canvas.create_line(0, self.top.get(), 900, self.top.get(), tag="top_line", fill='green') def onSliderBottom(self, args): change line self.canvas.delete("bottom_line") self.canvas.create_line(0, self.bottom.get(), 900, self.bottom.get(), tag="bottom_line", fill='red')

Nextボタンで次の画像を表示
Backボタンで前の画像を表示
Saveボタンで切り出し範囲を保存
Save Backボタンで保存画像番号を一つ戻る

MainWindow(root)
root.mainloop()

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

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

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

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

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

meg_

2019/11/24 05:25

・コードは「コードの挿入」で記入しましょう。 ・画像を貼ると回答がつきやすくなるかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問