質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3190閲覧

PySimpleGUIで、HTMLのようにplaceholderを指定したい。

ForestSeo

総合スコア2722

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/29 11:47

実現したいこと

PySimpleGUIで、HTMLのようにplaceholderを指定したい。

Code

Python

1sg.InputText("ファイル", key="load") 2```このままだと、入力するときに"ファイル"というを文字を消さないといけない。 3日本語の情報が少なく、分からなかったので質問させて頂きました。 4 5### Version 6Python: 3.7.7 7PySimpleGUI: 4.26.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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の場合(標準) の代替実装です。

イメージ説明

あまりテストしてないので、実装する場合のたたき台くらいに考えてください。

sgPlaceHolder Demo on repl.it

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

teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ForestSeo

2020/07/30 00:28

なるほど。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問