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

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

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

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

Tkinter

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

Q&A

解決済

2回答

5609閲覧

tkinter.ttk での Entry の背景色変更

mr_baby_q

総合スコア7

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2022/03/22 11:27

tkinterを使い、以下のGUIアプリを作ろうとしています。
Entryに半角数字を入力し、ボタンを押したとき、その数字が

  • 0以上ならば、文字色を青、Entryの背景を赤、状態をreadonlyになる
  • 0未満ならば、文字色を黒、Entryの背景を白、状態をnormalになる

これを以下のコードで実装したところ、
文字色(青/黒)、状態(readonly/normal)は意図通りの挙動をしたのですが、
背景色だけ、0以上の値を入力しても白のまま変わりません。
どこが誤っているのか、調べてみましたが見当がつきませんでした。
ご教示頂けないでしょうか?

Python

1import tkinter as tk 2from tkinter import ttk 3 4def check_entry(t, entry): 5 val = float(t.get()) 6 if val >= 0: 7 entry.configure(state="readonly", 8 foreground="blue", 9 background="red") 10 else: 11 entry.configure(state="normal", 12 foreground="black", 13 background="white") 14 15root = tk.Tk() 16frame = ttk.Frame(root) 17frame.pack() 18 19t1 = tk.StringVar() 20entry1 = ttk.Entry(frame, textvariable=t1) 21 22button1 = tk.Button(frame, text="ボタン", 23 command=lambda: check_entry(t1, entry1)) 24 25entry1.pack() 26button1.pack() 27 28root.mainloop()

バージョン

  • Python: 3.8.8
  • tkinter: 8.6.8

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

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

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

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

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

guest

回答2

0

teamiklさんのご回答で ttk.Entry では独自の ttk.Style を設定する、と理解できたため、
ttk.Entry を使用して、

  • 0以上ならば、文字色を青、Entryの背景を赤にする
  • 0未満ならば、文字色を黒、Entryの背景を白にする

(状態は、どちらも normal のまま)
とする場合も検討してみました。
以下の実装で実現できました。
同様のことをしたい方もいるかもしれないと考え、補足として実装例を投稿しておきます。

python

1import tkinter as tk 2from tkinter import ttk 3 4def check_entry(t, entry): 5 val = float(t.get()) 6 if val >= 0: 7 entry.configure(style="My.TEntry") 8 else: 9 entry.configure(style="ttk.TEntry") 10 11root = tk.Tk() 12 13s = ttk.Style() 14s.theme_use("default") 15# 独自の Style を設定する。 16s.configure("My.TEntry", 17 fieldbackground="red", 18 foreground="blue") 19 20frame = ttk.Frame(root) 21frame.pack() 22 23t1 = tk.StringVar() 24entry1 = ttk.Entry(frame, textvariable=t1) 25 26button1 = tk.Button(frame, text="ボタン", 27 command=lambda: check_entry(t1, entry1)) 28 29entry1.pack() 30button1.pack() 31 32root.mainloop()

投稿2022/03/23 09:52

mr_baby_q

総合スコア7

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

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

0

ベストアンサー

問題の原因は2点
tkinter.Entry と tkinter.ttk.Entry の2種類があり、
後者のウィジェット群では、ttk.Style によりカスタマイズします。

また、Entry では、状態の readonly や normal 毎にスタイルを設定できる為、
通常の背景色設定ではなく、readonly 時の背景色が適応されてます。

解決策 変更点2か所

diff

1- ttk.Entry 2+ tk.Entry 3 4- background="red" 5+ readonlybackground="red"

※ ttk.Entry には readonlybackground プロパティは有りません。
ttk.* のウィジェットを使う場合は、ttk.Style を使い設定を行うことになります。


追記: ttk.Entry を使う場合の、ttk.Style での設定

python

1 2import tkinter as tk 3from tkinter import ttk 4 5root = tk.Tk() 6style = ttk.Style(root) 7 8# ※重要: theme によっては、テーマの背景色が優先される場合がある 9style.theme_use("default") 10 11style.configure("My.TEntry", 12 foreground="black", 13 background="white", 14 ) 15style.map("My.TEntry", 16 foreground=[("readonly", "blue")], 17 fieldbackground=[("readonly", "red")], 18 ) 19 20entry = ttk.Entry(root, style="My.TEntry") # "My." の部分は任意の名前に変更可。"TEntry" の部分は ttk.Entry の固有名 21entry.pack() 22 23def onClicked(event): 24 # NOTE: ウィジェットは複数の状態を同時に持つことができる為、state メソッドで readonly 状態を on/off 25 if float(entry.get()) > 0: 26 entry.state(["readonly"]) 27 else: 28 entry.state(["!readonly"]) 29 30button = ttk.Button(root, text="OK") 31button.bind("<1>", onClicked) 32button.pack() 33 34root.mainloop()

投稿2022/03/23 05:48

編集2022/03/23 06:39
teamikl

総合スコア8664

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

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

mr_baby_q

2022/03/23 07:19

ご回答ありがとうございました。 見栄えの好みの問題からttkを使いたいという事情があったので、 ttkでの実装を例示して頂き、助かりました。 「readonlyの状態のときの背景色」として設定すればよい、ということですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問