前提・実現したいこと
「数字を入力するところはここだよ」ってわかるように、数字を入力する入力ボックスに薄い字で誘導するテキストを書きたいです。
試したこと
Tkinterで、入力ボックスと同じ座標に「数字」というラベルを置きました。入力ボックス上書きしているような状態なので、入力することが出来なくなりました。
補足情報(FW/ツールのバージョンなど)
Windows10
Python3.7.1
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
元回答
おそらくイメージしてるのはいわゆるプレースホルダー(下の画像のようなもの)かと思います.
残念なんながら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総合スコア62
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/27 10:50
2020/10/27 11:01
2020/10/27 12:05
2020/10/27 12:11
2020/10/27 12:29
2020/10/27 12:42
2020/10/27 13:15
2020/10/27 14:25
2020/10/29 14:27