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

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

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

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

Q&A

解決済

1回答

4516閲覧

入力ボックスに薄いテキストを書きたい

onikudaisuki

総合スコア23

Python 3.x

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

0グッド

0クリップ

投稿2020/10/27 10:33

編集2020/10/29 14:30

前提・実現したいこと

「数字を入力するところはここだよ」ってわかるように、数字を入力する入力ボックスに薄い字で誘導するテキストを書きたいです。

試したこと

Tkinterで、入力ボックスと同じ座標に「数字」というラベルを置きました。入力ボックス上書きしているような状態なので、入力することが出来なくなりました。

補足情報(FW/ツールのバージョンなど)

Windows10
Python3.7.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

元回答

おそらくイメージしてるのはいわゆるプレースホルダー(下の画像のようなもの)かと思います.

tkinter placeholderの例

残念なんながらTKinterのEntryはデフォルトでプレースホルダーを扱えません.

英語ですが,ここ に綺麗なPlaceholderを作成できるEntryのクラスに関する記事があります.表示してる画像は記事中のコードを実行したもののスクショです.


#追記

元記事ではインデントの一部がタブになっていてそのまま実行できないことがありますね.
PlaceHolderの座標(右寄せ,左寄せなど)を弄りたいならば記事のクラスをさらに改変する必要がありそうです.

取り敢えず参考として上で動かしたコードだけ貼っておきます.(インデントを修正しただけ)

python3import

1from tkinter import ttk 2 3 4class PlaceholderEntry(ttk.Entry): 5 def __init__(self, container, placeholder, *args, **kwargs): 6 super().__init__(container, *args, style="Placeholder.TEntry", **kwargs) 7 self.placeholder = placeholder 8 9 self.insert("0", self.placeholder) 10 self.bind("<FocusIn>", self._clear_placeholder) 11 self.bind("<FocusOut>", self._add_placeholder) 12 13 def _clear_placeholder(self, e): 14 if self["style"] == "Placeholder.TEntry": 15 self.delete("0", "end") 16 self["style"] = "TEntry" 17 18 def _add_placeholder(self, e): 19 if not self.get(): 20 self.insert("0", self.placeholder) 21 self["style"] = "Placeholder.TEntry" 22 23 24root = tk.Tk() 25style = ttk.Style(root) 26 27style.configure("Placeholder.TEntry", foreground="#d5d5d5") 28 29entry = PlaceholderEntry(root, "Sample placeholder") 30entry.pack() 31 32root.mainloop()

更に追記

なんとなくもったいない気がしたので私が手元で動かしたソース貼っておきます.
画像関係はずしてあるので戻す必要はありますが.

python3

1from tkinter import ttk 2import tkinter 3import random 4 5 6class PlaceholderEntry(tkinter.Entry): 7 def __init__(self, container, placeholder, *args, fg1="#d5d5d5", fg2="black", **kwargs): 8 super().__init__(container, *args, **kwargs) 9 self.placeholder = placeholder 10 self.fg1 = fg1 11 self.fg2 = fg2 12 13 self.insert("0", self.placeholder) 14 self.bind("<FocusIn>", self._clear_placeholder) 15 self.bind("<FocusOut>", self._add_placeholder) 16 self["fg"] = fg1 17 18 def _clear_placeholder(self, e): 19 if hasattr(self, "placeholder"): 20 self.delete("0", "end") 21 self["fg"] = self.fg2 22 23 def _add_placeholder(self, e): 24 if not self.get(): 25 self.insert("0", self.placeholder) 26 self["fg"] = self.fg2 27 28 29# 数字をランダム出力 30D = random.randint(0, 5) 31# ウィンドウ作成 32root = tkinter.Tk() 33root.title("運勢占い") 34root.minsize(640, 480) 35root.option_add("*font", ["MS Pゴシック", 22]) 36# 画像読み込み 37# getu = tkinter.PhotoImage(file="大吉.png") 38# ka = tkinter.PhotoImage(file="凶.png") 39# sui = tkinter.PhotoImage(file="吉.png") 40# moku = tkinter.PhotoImage(file="小吉.png") 41# #画像表示 42# canvas = tkinter.Canvas(bg="plum", width=640, height=480) 43# canvas.place(x=0, y=0) 44# img = tkinter.PhotoImage(file="神社.png") 45# canvas.create_image(320, 240, image=img) 46# ラベル01 47question = tkinter.Label(text="あなたが入力した数字で今日の運勢を調べます。\n 0から10の数字を↓に入力してください。", bg="plum") 48question.place(x=27, y=20) 49# ラベル02 50entry = PlaceholderEntry(root, "0", width=2, bd=4, bg="pink") 51entry.place(x=300, y=140) 52#ラベル03 53button = tkinter.Button(text="決定ボタン",bg="peachpuff") 54button.place(x=240, y=400) 55#おみくじ始まり 56def btn_click(): 57 a = float(entry.get()) 58 if a > 10: 59 again_text = tkinter.Label(text="0から10の数字を入力してください。",fg="red",bg="plum") 60 again_text.place(x=105,y=20) 61 question.destroy() 62 return 63 if a < 0: 64 again_text = tkinter.Label(text="0から10の数字を入力してください。",fg="red",bg="plum") 65 again_text.place(x=105,y=20) 66 question.destroy() 67 return 68 if a+D == 8 or a+D == 9: 69 again_text = tkinter.Label(text="                        ",fg="red",bg="plum") 70 again_text.place(x=100,y=20) 71 res_text = tkinter.Label(text="あなたの今日の運勢は大吉です。",fg="red", bg="plum") 72 res_text.place(x=115, y=20) 73 res_text = tkinter.Label(text="やったね!", bg="plum") 74 res_text.place(x=250, y=425) 75 canvas.delete("all") 76 question.destroy() 77 entry.destroy() 78 button.destroy() 79 canvas.create_image(320, 240, image=getu) 80 if 10 <= a+D <= 15: 81 again_text = tkinter.Label(text="                           ",fg="red",bg="plum") 82 again_text.place(x=100,y=20) 83 res_text = tkinter.Label(text="あなたの今日の運勢は凶です。",fg="darkviolet",bg="plum") 84 res_text.place(x=120, y=20) 85 res_text = tkinter.Label(text="ざんねーん", bg="plum") 86 res_text.place(x=250, y=425) 87 canvas.delete("all") 88 question.destroy() 89 entry.destroy() 90 button.destroy() 91 canvas.create_image(320, 240, image=ka) 92 if 4 <= a+D <= 7: 93 again_text = tkinter.Label(text="                           ",fg="red",bg="plum") 94 again_text.place(x=100,y=20) 95 res_text = tkinter.Label(text="あなたの今日の運勢は吉です。",fg="green",bg="plum") 96 res_text.place(x=120, y=24) 97 res_text = tkinter.Label(text="おっええやん", bg="plum") 98 res_text.place(x=240, y=430) 99 canvas.delete("all") 100 question.destroy() 101 entry.destroy() 102 button.destroy() 103 canvas.create_image(320, 245, image=sui) 104 if 0 <= a+D <= 3: 105 again_text = tkinter.Label(text="                           ",fg="red",bg="plum") 106 again_text.place(x=100,y=20) 107 res_text = tkinter.Label(text="あなたの今日の運勢は小吉です。",fg="sienna",bg="plum") 108 res_text.place(x=120, y=20) 109 res_text = tkinter.Label(text="いいじゃん!", bg="plum") 110 res_text.place(x=243, y=425) 111 canvas.delete("all") 112 question.destroy() 113 entry.destroy() 114 button.destroy() 115 canvas.create_image(320, 240, image=moku) 116button["command"] = btn_click 117 118root.mainloop() 119

投稿2020/10/27 10:46

編集2020/10/30 00:29
ebal

総合スコア62

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

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

onikudaisuki

2020/10/27 10:50

そうなんですね!記事も張ってもらえて嬉しいです^^ 頑張ってみます!
ebal

2020/10/27 11:01

こういう,普段目にするけど名前は知らない機能は名前に関する知識がないと検索できなくて困りますよね.うまくいくことを祈っています.
onikudaisuki

2020/10/27 12:05

プレースホルダの座標はどうやって変えるんですかね... この記事に乗ってるコードをコピペしたらインデントが間違ってるらしく実行できなかったです。(泣) プレースホルダという言葉を知ったので他にも調べてみましたがどれも英語で不自然で分かりにくかったです。もーうどうしましょう!笑
ebal

2020/10/27 12:11

取り敢えず回答に動いたコード追記しました
onikudaisuki

2020/10/27 12:29

ebalさんの追記したコードのfrom tkinter import ttkの下にimport tkinterを追加、root = tk.Tk()をroot = tkinter.Tk()に変更したらうまく実行できました!このプログラムを入力ボックスに連結するのは難しそうです笑できるのかなー 僕が書いたコード全てを追記しました!良かったら実行して現状を確認してみてください!!
ebal

2020/10/27 12:42

実行してほしい!とのことならせめてインデントを整えてください…… これを復元するのはかなりの手間ですし正しさを保証できないので. また,質問文中全てですがコードはMarkdownの機能を用いると追記の用に表示されるので見やすく,コピーしやすくなるのでベターです.
onikudaisuki

2020/10/27 13:15

本当にすみませんでした。これでできてますか...?何卒宜しくお願い致します。
ebal

2020/10/27 14:25

これで動くもの提示してしまうとこのサイトの理念に反するか……?とか思いつつ,動くものはできました. PlaceholderEntryの定義を少しかえて基底クラスをttk.Entryからtkinter.Entryにし,それに合わせて見た目変更の方法を変えたうえでラベル2(entry)のクラスをPlaceholderEntryに変えればいけますね.
onikudaisuki

2020/10/29 14:27

ご返信ありがとうございました。本当に申し訳ないですが、このオブジェクトを入力ボックスに連結させる僕の技術力が無いということと、入力ボックスにおいても見た目が悪くなりそうと思ったので、この案はやめようかなと思います。たくさんの時間と労力をこんな僕にかけて頂き、ありがとうございました。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問