【Flet】よく使う単語のコピー用ボタン集をつくる【Python】

2025年9月26日Flet,Python

よく使う単語のコピー用ボタン集をつくる

ちょくちょく使う面倒なテキスト入力をまとめておき、ボタンのクリックでコピーする方法です。


クリップボードに情報をコピーする

ボタンに設定されている情報をコピーする

概要

  • ボタンクリックでテキスト情報をクリップボードにコピーする
import flet as ft

def main(page: ft.Page) -> None:
    # クリップボードにテキストをコピーする関数
    def copy_to_clipboard(e: ft.ControlEvent) -> None:
        text = e.control.text
        page.set_clipboard(text)
        page.open(ft.SnackBar(ft.Text(f'Copied {text} to clipboard')))
        page.update()

    # ボタンを作成
    sample_button = ft.ElevatedButton(text='りんご', on_click=copy_to_clipboard)

    # 画面サイズ
    page.window.width = 300
    page.window.height = 300

    # ボタンをページに追加
    page.add(sample_button)

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

クリックでクリップボードに情報をコピーするボタンを複数配置する

処理内容

  • カレントディレクトリにあるExcelファイルを読み込む

    • 複数シート読み込み可能
    • シート名ごとにタブを作成し、タブで表示を切り替える
  • 読み込んだテキスト情報を持つボタンを作成する

  • このボタンをクリックするとテキスト情報がクリップボードにコピーされる

Excelファイル

  • ファイル名:data.xlsx
  • A,Bの2列×複数行で入力し、この行は可変とする

コード

import flet as ft
import pandas as pd

def main(page: ft.Page) -> None:
    # ページ全体のレイアウト
    page.window.width=600
    page.window.height=600

    # クリップボードにテキストをコピーする関数
    def copy_to_clipboard(e: ft.ControlEvent) -> None:
        text = e.control.text
        page.set_clipboard(text)
        page.open(ft.SnackBar(ft.Text(f'Copied {text} to clipboard')))
        page.update()

    # Excelファイルからデータを読み込む
    excel_data = pd.read_excel('data.xlsx', sheet_name=None, usecols='A,B', header=None, dtype=str)

    # 1列目と2列目の最大文字数を調べる
    max_len_col1 = 0
    max_len_col2 = 0
    for df in excel_data.values():
        max_len_col1 = max(max_len_col1, df[0].dropna().astype(str).map(len).max())
        max_len_col2 = max(max_len_col2, df[1].dropna().astype(str).map(len).max())

    # ピクセル幅に変換(1文字 ≒ 12px で調整)
    char_width_px = 12
    button_width_col1 = max_len_col1 * char_width_px + 20 # +20 は余白
    button_width_col2 = max_len_col2 * char_width_px + 20

    # タブ作成
    tabs = []

    for sheet_name, df in excel_data.items():
        column = ft.Column(
            controls=[
                ft.Row(
                    controls=[
                        ft.Container(
                            content=ft.ElevatedButton(text=row[0], on_click=copy_to_clipboard),
                            width=button_width_col1,
                            padding=5
                        ),
                        ft.Container(
                            content=ft.ElevatedButton(text=row[1], on_click=copy_to_clipboard) if pd.notna(row[1]) else ft.Container(),
                            width=button_width_col2,
                            padding=5
                        )
                    ]
                )
                for _, row in df.iterrows()
            ],
            scroll=ft.ScrollMode.AUTO,
            expand=True
        )
        tabs.append(ft.Tab(text=sheet_name, content=column))

    page.add(ft.Tabs(tabs=tabs, expand=True))

# アプリを実行
ft.app(target=main)

アプリ実行結果

ボタンクリック結果

Flet,Python

Posted by junichi