実現したいこと
PySimpleGUIで、HTMLのようにplaceholderを指定したい。
Code
Python
1sg.InputText("ファイル", key="load") 2```このままだと、入力するときに"ファイル"というを文字を消さないといけない。 3日本語の情報が少なく、分からなかったので質問させて頂きました。 4 5### Version 6Python: 3.7.7 7PySimpleGUI: 4.26.0
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
残念ながら、PySimpleGUI (tkinter) では対応してません。
解決案
- 自分で実装する
- wx/qt を使う
- tk8.7 を使う ※
実際の挙動を確認した訳では有りませんが、
PySimpleGUI 内部で使われているライブラリ側で、
placeholder 対応が予定されてます。
https://www.tcl.tk/man/tcl8.7/TkCmd/options.htm
現在の安定版の最新は 8.6 で、
Pythonにバンドルされてるものも最新で 8.6 なので、
将来のアップデート待ち。
以下、wx/qt/web の場合の placeholder の設定方法と、
tkの場合(標準) の代替実装です。
あまりテストしてないので、実装する場合のたたき台くらいに考えてください。
python
1# import PySimpleGUIWx as sg 2# import PySimpleGUIQt as sg 3# import PySimpleGUIWeb as sg 4import PySimpleGUI as sg 5 6 7def setPlaceholder(widget, placeholderText): 8 """ 9 wx/qt/web の場合、placeholder 設定を有効にします。 10 tk の場合、代替実装を利用。 11 12 実装メモ: 13 通常なら hasattr で属性チェックするところですが、 14 SimpleGUIWeb なのに Qt 用の属性が残っていたりする為、回避策を取ってます。 15 """ 16 if getattr(widget, "WxTextCtrl", None): # SimpleGUIWx 17 textCtrl = widget.WxTextCtrl # type: wx.TextCtrl 18 textCtrl.SetHint(placeholderText) 19 return 20 21 if getattr(widget, "QT_QLineEdit", None): # SimpleGUIQt 22 lineEdit = widget.QT_QLineEdit # type: QWidgets.QLineEdit 23 lineEdit.setPlaceholderText(placeholderText) 24 return 25 26 if getattr(widget, "Widget", None) and hasattr(widget.Widget, "attributes"): # SimpleGUIWeb 27 textInput = widget.Widget # type: remi.gui.TextInput 28 textInput.attributes["placeholder"] = placeholderText 29 return 30 31 if getattr(widget, "TKEntry", None): 32 # NOTE: tk8.7 will support "-placeholder" option 33 # 34 # entry = widget.TKEntry 35 # entry.config(placeholder=placeholderText) # XXX: 未検証 36 # return entry.get 37 # 38 entry = widget.TKEntry 39 40 def resetCursor(event=None): 41 if entry.get() == placeholderText: 42 entry.after_idle(entry.icursor, 0) 43 44 def startInput(event=None): 45 if entry.get() == placeholderText: 46 entry.delete(0, "end") 47 entry.config(fg="black") 48 else: 49 entry.after_idle(showPlaceholder) 50 51 def showPlaceholder(event=None): 52 if entry.get() == placeholderText or not entry.get(): 53 entry.delete(0, "end") 54 entry.insert(0, placeholderText) 55 entry.config(fg="gray50") 56 entry.after_idle(entry.icursor, 0) 57 58 entry.bind("<FocusIn>", resetCursor) 59 entry.bind("<FocusOut>", showPlaceholder) 60 entry.bind("<Button-1>", resetCursor) 61 entry.bind("<Key>", startInput) 62 showPlaceholder() 63 64 def get_value(): 65 # ※ Tk の場合のみ 66 # 空欄の場合、placeholder のテキストを入力値と勘違いしてしまうので、 67 # placeholder を表示中の場合は、空文字を返す、この関数を通じて実際の値を所得します。 68 # 69 # tk8.7 で placeholder オプションが実装されれば、廃止。 70 # 71 text = entry.get() 72 return text if text != placeholderText else "" 73 74 widget.Get = get_value 75 return 76 77 import warnings 78 warnings.warn("Unknown GUI Platform, setPlaceholder was ignored.") 79 80 81layout = [ 82 [sg.Input("", key="load")], 83 [sg.Button("OK")] 84] 85 86window = sg.Window("Placeholder", layout).Finalize() 87 88# NOTE: Finalize() を呼んで、ウィジェットの生成完了を待つ 89setPlaceholder(window["load"], placeholderText="FILE:") 90 91while True: 92 event, values = window.read() 93 94 if event == sg.WIN_CLOSED: 95 break 96 97 if event == "OK": 98 print("value: {}".format(values["load"])) 99 100window.close()
投稿2020/07/29 23:30
総合スコア8760
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/30 00:28