tkinterのFrame他で画像を循環表示する
pythonのtkinterモジュールを使って画像表示するのに下記のようなコードをコピペで作りました。しかしこのコードではクリックコマンドの動作に関する関数を備えていないため動きません。後ろのcanvasを使ったコードに示したような関数を組み込むにはどうすればいいのでしょうか。お教えください。
#Frameの例
import tkinter as tk
from tkinter import Frame, Label
from PIL import Image, ImageTk
import sys, os
root = tk.Tk()
root.title("Image in Frame Example")
root.geometry("600x450") # Optional: set window size
frame = Frame(root, width=500, height=400, bg="white")
frame.pack(pady=20) # Adjust padding as necessary
dir_name = "GUI"
image_data = [os.path.join(dir_name, file) for file in os.listdir(dir_name)\
if ".png" in file or ".PNG" in file or ".jpg" in file or ".JPG" in file or ".jpeg" in file or ".JPEG" in file or ".gif" in file or ".GIF" in file]
image = Image.open(image_data[7])
original_size =image.size
if image.size[0] <= image.size[1]:
h1 = 400
img =image.resize((int(h1/original_size[1]*original_size[0]), h1), Image.LANCZOS)
elif image.size[0] > image.size[1]:
w1 = 500
img =image.resize(( w1,int(w1/original_size[0]*original_size[1])), Image.LANCZOS)
photo_image = ImageTk.PhotoImage(img)
image_label = Label(frame, image=photo_image)
image_label.pack()
root.mainloop()
#canvasの例
import tkinter as tk
from PIL import Image, ImageTk
import sys, os
class Application(tk.Frame):
def __init__(self, master = None):
super().__init__(master)
self.master.title("画像の表示")
self.master.geometry("540x440")
self.canvas = tk.Canvas(self.master)
self.canvas.pack(expand = True, fill = tk.BOTH)
self.update()
canvas_width = self.canvas.winfo_width() - 20
canvas_height = self.canvas.winfo_height() - 40
dir_name = "GUI"
image_data = [os.path.join(dir_name, file) for file in os.listdir(dir_name)\
if ".png" in file or ".PNG" in file or ".jpg" in file or ".JPG" in file or ".jpeg" in file or ".JPEG" in file or ".gif" in file or ".GIF" in file]
pil_image = Image.open(image_data[9])
original_size =pil_image.size
if pil_image.size[0] <= pil_image.size[1]:
h1 = canvas_height
img =pil_image.resize((int(h1/original_size[1]*original_size[0]), h1), Image.LANCZOS)
elif pil_image.size[0] > pil_image.size[1]:
w1 = canvas_width
img =pil_image.resize(( w1,int(w1/original_size[0]*original_size[1])), Image.LANCZOS)
self.photo_image = ImageTk.PhotoImage(image= img)
self.canvas.create_image(
canvas_width / 2 + 10,
canvas_height / 2,
image=self.photo_image
)
btn=tk.Button(text='Click',command="")
btn.pack(ipadx=10,ipady=5)
if __name__ == "__main__":
root = tk.Tk()
app = Application(master = root)
app.mainloop()
#クリック動作に関する関数を含む例
import tkinter as tk
index=0 #画像のindexはグローバルで管理する
def btn_click():
global index
index=(index+1) % len(photos)
canvas.delete('p1')
canvas.create_image(320,213,image=photos[index],tag='p1')
root=tk.Tk()
root.geometry('700x560')
root['bg']='lightgrey'
canvas=tk.Canvas(root,width=640,height=426,bd=0, highlightthickness=0, relief='ridge')
canvas.pack(pady=20)
photos=[
tk.PhotoImage(file='GUI/s.png'),
tk.PhotoImage(file='GUI/frog2.png'),
tk.PhotoImage(file='GUI/k05.png'),
]
canvas.create_image(320,213,image=photos[index],tag='p1')
btn=tk.Button(text='Click',command=btn_click)
btn.pack(ipadx=10,ipady=5)
root.mainloop()
TkEasyGUIのcanvasで出来ないかと思いましたがなんかそこまでの部品が見当たらないようなので他を探してみたところtkinterでの例が見受けられたので早速画像のアスペクト比を維持して表示する方法をcanvasを含めいろいろ組み込んでみましたが、いざ循環表示の処でお手上げです。なおFrameの場合適正なボタン配置が分かりませんでした。
私みたいな半端な者には、サイトによって様々な方法が紹介されていても同じpythonの文法として理解できないのが現状です。よろしくお願いします。
お礼
回答ありがとうございます。 うーん、無理っぽいんですか・・・ wxPythonも後で調べて見ます。 詳しい解説までして頂きありがとうございました。