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

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

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

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

Q&A

解決済

1回答

360閲覧

PythonのPyqrcodeとTkinterを使い生成したQRコードをキャンバスに貼り付けたい

shinobuKouno

総合スコア31

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

0グッド

0クリップ

投稿2022/07/30 04:46

Pythonを勉強中の初心者です。QRコードを作り、Tkinterのキャンバスで表示
させたいのですが、
’cnv.create_image(100,100, image=code)’```ここに言語を入力

がエラーになり実行できません。画像をキャンバスにいれる方法を教えてください。

Python 3.10.5
Tkinter 8.6

Python

1import pyqrcode 2import tkinter as tk 3from PIL import ImageTk 4 5root = tk.Tk() 6root.title('QRコード') 7root.geometry("1200x1200") 8 9list = ['aaa','bbb','ccc','ddd'] 10 11for va in list: 12 13 code = pyqrcode.create(va, error='H', version=3, mode='binary') 14 code.png('code.png', scale=5, module_color=[0, 0, 0, 128], background=[255, 255, 255]) 15 16 cnv = tk.Canvas(root, bg="white", height=200, width=200) 17 cnv.place(x=10, y=i) 18 cnv.create_image(100,100, image=code) 19 i = i + 200 20 21root.mainloop()

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

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

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

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

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

teamikl

2022/08/01 06:08

エラーの内容を記載してください。
guest

回答1

0

ベストアンサー

原因: 引数の型の不一致

Tkinter の Canvas の create_image には tkinter.PhotoImage オブジェクトを指定します。

code.png ファイルがあると仮定するなら

python

1image = tk.PhotoImage("code.png") 2canvas.create_image(100, 100, image=image) 3

注意点は、質問のコードだと for文内での記述なので、変数名を使いまわしていると
PhotoImage 変数が次のループで上書きされ、前ループのPhotoImageが破棄されてしまいます。
PhotoImage オブジェクトはリストへ格納するなどの対策をしてください。(変数の生存期間とGCに注意)

投稿2022/08/01 06:13

teamikl

総合スコア8664

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

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

shinobuKouno

2022/08/03 04:39

回答ありがとうございます。 エラーが消えて実行できるようになりました。 しかし、pngファイルが生成され、キャンバスも表示されるようになりましたが、キャンバス上にpngファイルが表示されません これについても教えて頂けると嬉しです。 root = tk.Tk() root.title('QRコード') root.geometry("1200x1200") list = ['aaa', 'bbb', 'ccc', 'ddd'] i = 0 for va in list: st = va + '.png' code = pyqrcode.create(va, error='H', version=3, mode='binary') code.png(st, scale=5, module_color=[0, 0, 0, 128], background=[255, 255, 255]) image = tk.PhotoImage(st) canvas = tk.Canvas(root, bg="white", height=200, width=200) canvas.create_image(100, 100, image=image) canvas.place(x=10, y=i) i = i + 200 root.mainloop()
teamikl

2022/08/03 05:17

回答の末尾に記載した注意点に該当しそうです。 PhotoImageオブジェクトを格納している変数 image がループで上書きされる為、 正常に実行されたなら、最後のループの画像しか表示されないはずです。 (全く表示されない場合は別の問題の可能性もあるので、追加で情報が必要です) まずは、forループなしのコードを作り画像を一つだけ表示してみてください。 次に、PhotoImage オブジェクトを格納した変数を、forループ外で確保したリスト等に保持するようにして PhotoImage オブジェクトが破棄されるのを回避します。
shinobuKouno

2022/08/03 13:03 編集

ありがとうございます↓のコードでも同様にウインドウにaaaa.pngファイルは生成され、ウインドウとキャンバスが表示されるのですが、キャンバス上に生成したpngファイルは乗はのりませんでした。 import pyqrcode import tkinter as tk from PIL import ImageTk root = tk.Tk() root.title('QRコード') root.geometry("1200x1200") code = pyqrcode.create('aaaa', error='H', version=3, mode='binary') code.png('aaaa.png', scale=5, module_color=[0, 0, 0, 128], background=[255, 255, 255]) image = tk.PhotoImage('aaaa.png') canvas = tk.Canvas(root, bg="white", height=200, width=200) canvas.create_image(100, 100, image=image) canvas.place(x=10, y=0) root.mainloop()
teamikl

2022/08/04 05:14

pyqrcode 以外で PNG ファイルを作成して、キャンバスにpng画像を表示は可能ですか? tkinter 部分のコードに関しては、python3.9/win10 で画像が表示できるのを確認しました。 tkinter のバージョンが古くない限りは PNG 形式のファイルの読み込みには対応してます。
shinobuKouno

2022/08/04 09:01

'testa.png'ファイルを作り次のコードを試しましたが 画像表示され、その画像を閉じるとウインドウの中に画像のないキャンバスが表示されるだけで、キャンバスに画像は乗りませんでした Tkinterのバージョンはコマンドプロンプトで確認すると8.6でした。 import tkinter as tk import cv2 from PIL import Image, ImageTk imgtest = cv2.imread("testa.png") cv2.imshow("Image", imgtest) cv2.waitKey() root = tk.Tk() root.geometry("900x600") image = tk.PhotoImage('testa.png') canvas = tk.Canvas(root, bg="white", height=300, width=300) canvas.create_image(200, 200, image=image) canvas.place(x=10, y=0) root.mainloop() ↓のコードでもキャンバスは乗りませんでした。 import tkinter as tk from PIL import Image, ImageTk root = tk.Tk() root.geometry("900x600") image = tk.PhotoImage('testa.png') canvas = tk.Canvas(root, bg="white", height=300, width=300) canvas.create_image(200, 200, image=image) canvas.place(x=10, y=0) root.mainloop()
teamikl

2022/08/04 09:42 編集

tk.PhotoImage(file = "testa.png") と、ファイルを対象にしてみてください。
shinobuKouno

2022/08/04 10:37

ありがとうございます ↓のコードで動きましたm(__)m for va in list: strb = va + '.png' code = pyqrcode.create(va, error='H', version=3, mode='binary') code.png(strb, scale=5, module_color=[0, 0, 0, 128], background=[255, 255, 255]) photolist.append(tk.PhotoImage(file=strb)) i = 0 for r in range(0, len(photolist)): cnv = tk.Canvas(root, bg="white", height=200, width=200) cnv.place(x=10, y=i) cnv.create_image(100, 100, image=photolist[r]) i = i + 200 root.mainloop()
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問