3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[PySimpleGUI] ボタンが押されるたびにInputボックスを追加していく

Posted at

概要

何かしらボタンが押されたときにInputボックスが追加されるようなインターフェイスが欲しかったが、
ネット上に情報がなかったので備忘録としてあげさせていただく
(下画像はヘタクソなイメージ図)

例えば先にInputボックスを10個用意しておいて非表示にしておく → ボタンが押されるたびに非表示を解除
みたいなコードも可だが、やっぱり上限値は設定したくないのでがんばった

実行環境

・Windows10
・Python 3.11.0
・PySimpleGUI 4.60.4

サンプルコード

Add_Input.py
import PySimpleGUI as sg
import sys


num = 1     #Inputボックスの数
g_value = {0 :""}   #Inputボックスの初期値
g_window_pos = (None, None)     #WIndowの表示座標


def Window(num):
    layout = []
    for i in range(num - 1):
        layout.append([sg.Input(default_text=g_value[i], size=(100,1))])

    layout.append([sg.Input(size=(100,1))]) 
    layout.append([sg.Button("追加")])

    return sg.Window("TEST", layout, location=g_window_pos)


while True:
    boot_window = Window(num)

    while True:
        event, values = boot_window.read()

        if event == sg.WIN_CLOSED:
            sys.exit()

        if event == "追加":
            num += 1
            g_value = values
            g_window_pos = boot_window.current_location()

            boot_window.close()
            break

あくまでInputボックスを増やす最低限しか書いていないので、その後の処理とかループ抜け処理などは各自で

解説

普通に考えたら、最初に生成するLayoutに追加のInputをappend → windowを再起動で動きそうだが、
通常、layoutにて記載した要素はIDが固定されてしまうようで、使いまわしができないらしい

Add_Input_Fail.py
-import PySimpleGUI as sg
-import sys
-
-
-layout = [[sg.Input(size=(100,1))]]
-layout.append([sg.Button("追加")])
-
-
-boot_window = sg.Window("TEST",layout)
-while True:
-    event , values = boot_window.read()
-
-    if event == sg.WIN_CLOSED:
-        sys.exit()
-
-    if event == "追加":
-        layout.append([sg.Input(size=(100,1))])
-        boot_window.close()
-        boot_window = sg.Window("TEST",layout)

↓上記実行後、"作成"ボタンを押した際に出るエラー
input_error.png

というわけでlayoutを使いまわす手段にてこずっていたところ
下のGithubの最後のコメントにPySimpleGUI様公式からやり方がかかれていたのでありがたく参考にさせていただいた
(Githubでの def make_window を 上コードでの def Window にて参考)

また、本コードではInputボックスを追加するために一度現在出しているWindowを閉じ、再度開きなおす処理が行われる
この際、Windowが開いていた座標、Windowに入力されていた情報を変数に入れておくと使い勝手が向上する
(上コードでの "g_value" , "g_window_pos")

あとがき

初投稿なので読み辛い点あるかと思いますがお手柔らかにお願いいたします

参考文献

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?