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

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

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

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

Tkinter

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

Q&A

解決済

1回答

717閲覧

tkinterで画像をエンターで切り替える

reiya_123

総合スコア57

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2022/05/02 05:49

前提・実現したいこと

ubuntu20.04
python3.8を使用しています

画像をエンター押すことで切り替えたいと考えています
ですが、現状はimageに全画像が読み込まれているために表示ができていません。
なので、エンターを押すたびに一枚ずつ読み込むようなプログラムに変えたいです。
申し訳ございませんがご教示いただけないでしょうか。

該当のソースコード

def Image_insertion(self): files = natsorted(glob.glob("/home/limlab/deep_learning/japan_imagecaption/data/photo_data/*.jpg")) for n in range(len(files)): image = Image.open(files[n],'r') self.img = ImageTk.PhotoImage(image) width,height = image.size canvas = tkinter.Canvas(self,width=width,height=height) canvas.pack() canvas.create_image(width/2,height/2,image = self.img) def enter_fin(self): # テキストボックスのエンター部分 self.entry = tkinter.Entry(self,bd=5,width=80,fg="red",relief='raised') self.entry.place(x='30', y='500') text1 = self.entry.get() label1 = tkinter.Label(text=text1) label1.place(x=30, y=400) #エンター self.entry.bind('<Return>',self.Image_insertion)

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

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

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

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

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

guest

回答1

0

ベストアンサー

ジェネレーターを用いると、呼ばれる度にfor文を1回づつ実行の様なことが可能です。

イベントハンドラ内のfor文を駆逐実行したい場合

python

1import tkinter as tk 2 3root = tk.Tk() 4var = tk.IntVar(root, value=0) 5label = tk.Label(root, textvar=var) 6label.pack() 7 8def onEnterGen(): 9 for num in range(20): 10 event = yield num 11 var.set(num) 12 13onEnter = onEnterGen() 14next(onEnter) # 関数内の yield 位置まで実行を進める 15 16root.bind_all("<Return>", onEnter.send) # イベントが発生すると yield の左辺に値を渡す 17root.mainloop()

実装としてはイベントハンドラ内でfor文は用いずに、

  • 関数外部でファイル一覧を所得し
  • 関数内では組み込み関数の next でリストから次の値を順に取り出す

とした方が扱いやすくなります。

python

1import tkinter as tk 2 3# ※ここでは仮データとして数列を利用します。 4# 実際は glob でファイル一覧を所得 5files = iter(range(20)) 6 7root = tk.Tk() 8var = tk.IntVar(root, value=0) 9label = tk.Label(root, textvar=var) 10label.pack() 11 12def onEnter(event): 13 item = next(files, None) # files から次の要素を所得 14 if item: 15 var.set(item) # 実際はここで画像表示 16root.bind_all("<Return>", onEnter) 17 18root.mainloop()

投稿2022/05/02 10:04

編集2022/05/02 10:15
teamikl

総合スコア8664

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問