pythonのfletでパスの選択で画像表示をする
FletというPythonのGUIライブラリを用いて画像を循環表示させることに挑戦しています。一応下記のように選択した複数の画像ファイのパスを引数として別ファイルで読み込み画像表示までは出来ました。しかしながらこれでは保存用のテキストファイルは別にして2つのファイルにまたがるため無駄で動作が遅く感じられます。そのため1つのファイルに纏められないかとおもいましたがflet初心者では全く手に負えません。
出来るなら2個のView画面で実現できればと思います。
よろしくおねがいします。
# test003_11.py・・選択した複数の画像ファイのパスをテキストデータとして引数とし別ファイルで開く
import flet as ft
import sys, os
import subprocess
def main(page: ft.Page):
def pick_files_result(e: ft.FilePickerResultEvent):
selected_files.value = (
",".join(map(lambda f: f.path, e.files)) if e.files else "Cancelled!"
)
selected_files.update()
pick_files_dialog = ft.FilePicker(on_result=pick_files_result)
selected_files = ft.Text()
page.overlay.append(pick_files_dialog)
def move_file(self):
page.window_destroy()
image_data=f"{selected_files.value}".split(",")
subprocess.run(["python","Flet/test001_11.py"]+ image_data, capture_output=True, text=True, encoding='utf-8')
def remove_file(self):
page.window_destroy()
SCRIPT_DIR = os.path.dirname(__file__)
SAVE_FILE = os.path.join(SCRIPT_DIR, "VF_FILE.txt")
with open(SAVE_FILE, "r", encoding="utf-8") as f:
s = f.read()
image_data=f"{s}".split(",")
subprocess.run(["python","Flet/test001_11.py"]+ image_data, capture_output=True, text=True, encoding='utf-8')
page.add(
ft.Row(
[
ft.ElevatedButton(
"Pick files",
icon=ft.Icons.UPLOAD_FILE,
on_click=lambda _: pick_files_dialog.pick_files(
allow_multiple=True,
file_type=ft.FilePickerFileType.IMAGE
),
),
selected_files
]
),
ft.Column([ft.ElevatedButton("image",on_click=move_file),ft.ElevatedButton("remove",on_click=remove_file)])
)
ft.app(main)
#test001_11.py・・引数からファイルパスを読込み画像を循環表示
import math
import flet as ft
import sys, os
import subprocess
def main(page: ft.Page):
page.window_width = 600
page.window_height = 580
page.bgcolor = ft.colors.ORANGE
# 画像のリスト
images = sys.argv[1:] # 引数から指定画像形式のみを抽出
current_image_index = [0]
image = ft.Image(src=images[current_image_index[0]], width=570, height=480,)
page.add(image)
def next_image(e):
if current_image_index[0] < len(images) - 1:
current_image_index[0] += 1
else:
current_image_index[0] = 0 # 最後の画像の後は最初に戻る
image.src = images[current_image_index[0]]
page.update()
def prev_image(e):
if current_image_index[0] > 0:
current_image_index[0] -= 1
else:
current_image_index[0] = len(images) - 1
image.src = images[current_image_index[0]]
page.update()
def first_image(e):
current_image_index[0] = 0
image.src = images[current_image_index[0]]
page.update()
def move_file(self):
page.window_destroy()
subprocess.run(["python","Flet/test003_11.py"], encoding='utf-8')
def save_file(e):
image_list = ",".join(images)
with open("D:/Python/Flet/VF_FILE.txt", "w", encoding="utf-8") as f:
f.write(image_list)
next_button = ft.IconButton(
icon=ft.Icons.PLAY_CIRCLE_FILL_OUTLINED, on_click=next_image,icon_color="blue500")
prev_button = ft.IconButton(
icon=ft.Icons.PLAY_CIRCLE_FILL_OUTLINED, on_click=prev_image,rotate=ft.Rotate(angle=-1 * math.pi),icon_color="blue500")
first_button = ft.IconButton(
icon=ft.Icons.PAUSE_CIRCLE_FILLED_ROUNDED, on_click=first_image)
move_button = ft.ElevatedButton("main",on_click=move_file)
save_button = ft.ElevatedButton("保存",on_click=save_file)
button_row = ft.Row([prev_button,first_button, next_button,move_button,save_button],spacing=0,)
page.add(button_row)
page.update()
ft.app(target=main)
お礼
なるほど、(.*)部分はselfだけでは受けられないんですね。 全て連結されたものがそのままselfに入るのかと思ってました。 TypeError: get() takes exactly 1 argument (2 given) の意味もrequest.get('ID')の引数がおかしいのではなく、def get(self)のアーギュメントが足りないという警告だったんですね。 ちなみに(.*)を無くして/pageだけでやってみたらうまくいきました。 上記のことを考えたら納得がいきました。 考えて頂きどうもありがとうございました。