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

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

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

Tclは、インタープリタ型のプログラミング言語。リスト処理や連想配列といった特長を持ち、文法もシンプルです。拡張や他言語への組み込みが簡単にでき、アプリケーション拡張にための組み込み言語として用いられます。

Python 3.x

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

Python

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

Q&A

解決済

1回答

5553閲覧

PySimpleGUIで画像を表示したいがエラーになる

per_

総合スコア41

Tcl

Tclは、インタープリタ型のプログラミング言語。リスト処理や連想配列といった特長を持ち、文法もシンプルです。拡張や他言語への組み込みが簡単にでき、アプリケーション拡張にための組み込み言語として用いられます。

Python 3.x

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

Python

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

1グッド

0クリップ

投稿2020/11/27 05:31

編集2020/11/27 05:42

前提・実現したいこと

  1. 特定のフォルダ(今回はDesktop\new)に保存されている

JPG、PNGどちらかの拡張子の画像ファイルをランダムで取得する
0. 画像を適切なサイズにリサイズする
0. 画面に表示する

ということを PySimpleGUI で実現させたいのですが、以下のエラーが解決できずに困っています。
お力をお貸しいただけますと幸いです。

補足

基本的にはJPG画像がほとんどですが、両方の拡張子の画像を表示させたいです。
tkinter では表示できる拡張子が限られているため、Pillow ライブラリの ImageTk を採用しています。

発生している問題・エラーメッセージ

例外が発生しました: TclError couldn't recognize image data

該当のソースコード

Python

1#!python3.7 2 3import glob 4import random 5import tkinter as tk 6 7import PySimpleGUI as sg 8from PIL import Image, ImageTk 9 10dir_name =r'C:\Users\USER\Desktop\new' 11img_types = (".jpg",".png") 12 13#ランダムに画像を1枚取る関数 14def random_pick(): 15 global dir_name 16 global img_types 17 while True: 18 img_list = glob.glob(dir_name + '\*') 19 pickfile = random.choice(img_list) 20 if pickfile.lower().endswith(img_types): 21 return pickfile 22 23# 画像をリサイズするための倍率を求める 24def set_magnification(iw ,ih): 25 rew = iw 26 reh = ih 27 n = 1 28 while rew > 600 and reh > 600: 29 rew = iw /n 30 reh = ih /n 31 n += 0.5 32 return n 33 34def get_img_data(f): 35 """Generate image data using PIL""" 36 print("open file:", f) 37 img = Image.open(f) 38 magf = set_magnification(img.width, img.height) 39 img_resize = img.resize((int(img.width/magf), int(img.height/magf))) 40 return ImageTk.PhotoImage(img_resize) 41 42 43def main(): 44 sg.ChangeLookAndFeel('BlueMono') 45 pfile = random_pick() 46 47 image_elem = sg.Image(data=get_img_data(pfile)) 48 filename_display_elem = sg.Text(pfile, size=(80, 3)) 49 layout = [[filename_display_elem],[image_elem],[sg.OK()]] 50 51 window = sg.Window('画像を表示します', layout, return_keyboard_events=True, 52 location=(0, 0), use_default_focus=False) 53 54# event loop 55 while True: 56 event, value = window.read()  # ????ここでエラー 57 print(event,value) 58 if event in (None, 'Exit'): 59 break 60 window.close() 61 62if __name__ == "__main__": 63 root = tk.Tk() 64 root.withdraw() 65 main() 66 67 68

試したこと

こちらの記事を元にコードを作成しました。
JPG、PNGのどちらかだけに絞って試してみましたが、同様のエラーが出ました。

情報(FW/ツールのバージョンなど)

Windows10
Python3.7
VScode

teamikl👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

実際にエラーが起こっているのは、以下の箇所です。

image_elem = sg.Image(data=get_img_data(pfile))

引数 data の取る値は、bytes 型のデータを渡します。

:param data: Raw or Base64 representation of the image to put on button. Choose either filename or data
:type data: Union[bytes, str]

get_img_data 関数では、

return ImageTk.PhotoImage(img_resize)

になっていますが、参考URLの記事では first=True となってるので、
bytes の方のデータを返すようにしてみてください。

投稿2020/11/27 06:59

teamikl

総合スコア8681

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

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

per_

2020/11/27 08:46

参考にしたサイトを元にコードを書き替えたら無事に表示されました。 bio.getvalue() の処理の意味が良く分からずに省略してしまいましたが、teamiklさんのおかげで理由もわかりすっきりです! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問