【Flet】ボタンからテキストファイルを処理する【Python】

Flet,Python

ボタンからテキストファイルを処理する


ボタンからテキストファイルを開く①

テキストファイルの選択と内容の表示

概要

  • ボタンからファイル選択ダイアログを表示する
  • ダイアログから選択したファイルを表示する
  • 選択したファイルの内容をテキストフィールドに表示する
  • 選択できるのは拡張子が txt のファイルに制限する
import flet as ft

def main(page: ft.Page):
    # ファイル選択ダイアログからファイルが選択されたときに実行される関数
    def on_file_pick(e: ft.FilePickerResultEvent):
        if e.files:
            file_path = e.files[0].path
            try:
                with open(file_path, 'r', encoding='utf-8') as file:
                    file_content = file.read()
                #ファイルの内容をTextFieldに表示
                picked_text_field.value = file_content
            except UnicodeDecodeError:
                picked_text_field.value = r'ファイルの読み込み中にエンコーディングエラーが発生しました。UTF-8エンコーディングを使用してください。'
            except Exception as e:
                picked_text_field.value = f'ファイルの読み込み中にエラーが発生しました: {str(e)}'
            page.update()

    # ファイル選択ダイアログを作成
    file_picker = ft.FilePicker(on_result=on_file_pick)
    page.overlay.append(file_picker)

    # ファイル選択ボタンを作成
    button = ft. ElevatedButton(text='設定ファイルを表示', on_click=lambda _: file_picker.pick_files(allowed_extensions=['txt']))

    # ファイルの内容を表示するTextFieldを作成
    picked_text_field = ft.TextField(read_only=True, multiline=True, expand=True)

    # ページにボタンとTextFieldを追加
    page.add(button, picked_text_field)

# Fletアプリケーションを実行
ft.app(target=main)

ボタンクリック実行結果

テキストファイル選択結果


ボタンからテキストファイルを開く②

選択したファイルの編集と保存をする

概要

  • ファイルを表示するボタンに加えて編集、保存用のボタンを追加する
  • どの関数からも対象ファイルが参照できるようにグローバル関数にファイルパスを格納する
import flet as ft

file_path = None

def main(page: ft.Page):
    global file_path

    # ファイル選択ダイアログからファイルが選択されたときに実行される関数
    def on_file_pick(e: ft.FilePickerResultEvent):
        global file_path
        if e.files:
            file_path = e.files[0].path
            try:
                with open(file_path, 'r', encoding='utf-8') as file:
                    file_content = file.read()
                # ファイルの内容をTextFieldに表示する
                picked_text_field.value = file_content
                picked_text_field.read_only = True
                edit_button.disabled = False
                save_button.disabled = True
                open_button.text = 'ファイルを非表示'
                page.update()
            except UnicodeDecodeError:
                picked_text_field.value = r'ファイルの読み込み中にエンコーディングエラーが発生しました。UTF-8エンコーディングを使用してください。'
            except Exception as e:
                picked_text_field.value = f'ファイルの読み込み中にエラーが発生しました: {str(e)}'
            page.update()

    # 表示ボタンクリック処理
    def on_open_click(e):
        if open_button.text == 'ファイルを非表示':
            picked_text_field.value = ''
            picked_text_field.read_only = True
            edit_button.disabled = True
            save_button.disabled = True
            open_button.text = 'ファイルを表示'
        elif open_button.text == 'ファイルを表示':
            file_picker.pick_files(allowed_extensions=['txt'])
        page.update()

    # 編集ボタンクリック処理
    def on_edit_click(e):
        picked_text_field.read_only = False
        save_button.disabled = False
        edit_button.disabled = True
        page.update()

    # 保存ボタンクリック処理
    def on_save_click(e):
        global file_path
        try:
            with open(file_path, 'w', encoding='utf-8') as file:
                file.write(picked_text_field.value)
            picked_text_field.read_only = True
            save_button.disabled = True
            page.update()
        except Exception as e:
            picked_text_field.value =f'ファイルの保存中にエラーが発生しました: {str(e)}'
            page.update()

    # ファイル選択ダイアログを作成
    file_picker = ft.FilePicker(on_result=on_file_pick)
    page.overlay.append(file_picker)

    # ファイル選択ボタンを作成
    open_button = ft.ElevatedButton(text='ファイルを表示', on_click=on_open_click)
    edit_button = ft.ElevatedButton(text='編集', on_click=on_edit_click, disabled=True)
    save_button = ft.ElevatedButton(text='保存', on_click=on_save_click, disabled=True)

    # ファイルの内容を表示するTextFieldを作成
    picked_text_field = ft.TextField(read_only=True, multiline=True, expand=True)

    # ページにボタンとTextFieldを追加
    page.add(ft.Row([open_button, edit_button, save_button]), picked_text_field)

# Fletアプリケーションを実行
ft.app(target=main)

Flet,Python

Posted by junichi