概要
何かしらボタンが押されたときにInputボックスが追加されるようなインターフェイスが欲しかったが、
ネット上に情報がなかったので備忘録としてあげさせていただく
(下画像はヘタクソなイメージ図)
例えば先にInputボックスを10個用意しておいて非表示にしておく → ボタンが押されるたびに非表示を解除
みたいなコードも可だが、やっぱり上限値は設定したくないのでがんばった
実行環境
・Windows10
・Python 3.11.0
・PySimpleGUI 4.60.4
サンプルコード
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が固定されてしまうようで、使いまわしができないらしい
-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)
というわけでlayoutを使いまわす手段にてこずっていたところ
下のGithubの最後のコメントにPySimpleGUI様公式からやり方がかかれていたのでありがたく参考にさせていただいた
(Githubでの def make_window を 上コードでの def Window にて参考)
また、本コードではInputボックスを追加するために一度現在出しているWindowを閉じ、再度開きなおす処理が行われる
この際、Windowが開いていた座標、Windowに入力されていた情報を変数に入れておくと使い勝手が向上する
(上コードでの "g_value" , "g_window_pos")
あとがき
初投稿なので読み辛い点あるかと思いますがお手柔らかにお願いいたします
参考文献