pythonのfletでViewの使い方について2
pickerで得た画像ファイルのパスをを元に別Viewで循環表示及び保存したファイルパスのテキストファイルから読み込み画像表示をするコードを見よう見まねで下記のようにしてみました。以前相談した2つのファイルを使った方法では、パスデータを引数で切り替えだけで済んでいたのですが、今回は、切った張ったしたせいか複雑化したように思えます。このような方法で正しいかあるいは無駄な部分がないかどうかお教えください。
import flet as ft
import sys, os
def main(page: ft.Page):
selected_files = ft.Text()
images = [""]
def pick_files_result(e: ft.FilePickerResultEvent):
nonlocal images
images = [f.path for f in e.files] if e.files else []
selected_files.value = ",".join(images) if images else "Cancelled!"
selected_files.update()
if images:
current_image_index[0] = 0
image.src = images[current_image_index[0]]
page.update()
pick_files_dialog = ft.FilePicker(on_result=pick_files_result)
page.overlay.append(pick_files_dialog)
def move_file(self):
page.go("/store")
#保存ファイルからパスデータを読み込む
def remove_file(self):
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:
sav_files = f.read()
nonlocal images
images = f"{sav_files}".split(",")
if images:
current_image_index[0] = 0
image.src = images[current_image_index[0]]
page.update()
page.go("/store")
#page.add()
images = images
current_image_index = [0]
image = ft.Image(src=images[current_image_index[0]], width=300, height=200)
def next_image(e):
current_image_index[0] = (current_image_index[0] + 1) % len(images)
image.src = images[current_image_index[0]]
page.update()
def prev_image(e):
current_image_index[0] = (current_image_index[0] - 1) % len(images)
image.src = images[current_image_index[0]]
page.update()
# 画像のリストをテキストファイルとして保存する
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)
def route_change(route):
page.views.clear()
page.views.append(
ft.View(
"/",
[
ft.AppBar(title=ft.Text("Flet app"), bgcolor=ft.Colors.AMBER_600),
ft.ElevatedButton("save_image",on_click=remove_file),
#ft.ElevatedButton("Visit Store", on_click=lambda _: page.go("/store")),
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.ElevatedButton("Pick_image",on_click=move_file),
],
)
)
if page.route == "/store":
page.views.clear()
page.views.append(
ft.View(
"/store",
[
ft.AppBar(title=ft.Text("Store"), bgcolor=ft.Colors.BLUE_GREY_200),
image,
ft.Row([ft.ElevatedButton(text="前の画像", on_click=prev_image), ft.ElevatedButton(text="次の画像", on_click=next_image)]),
ft.ElevatedButton("Save", on_click=save_file),ft.ElevatedButton("Go Home", on_click=lambda _: page.go("/")),
],
)
)
page.update()
def view_pop(view):
page.views.pop()
top_view = page.views[-1]
page.go(top_view.route)
page.on_route_change = route_change
page.on_view_pop = view_pop
page.go(page.route)
ft.app(target=main)