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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Tkinter

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

Python

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

Q&A

解決済

1回答

2345閲覧

Python Tkinter ボタンを押したときにフォーカス移動しないようにしたい

person

総合スコア223

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/08/23 23:45

ボタンを押したら、エントリのテキストをgetしたいです。また、クリアしたいです。

下記のようにソースコードを作りましたが、tk.Buttonだとできてttk.Buttonだとできません。
ttk.Buttonの場合は、ボタン押したときにそのボタンにフォーカスが移動してしまうからです。

ttk.Buttonで目的の機能を実装することは可能ですか?

Python

1import tkinter as tk 2from tkinter import ttk 3 4 5def on_button1(): 6 widget = root.focus_get() 7 if isinstance(widget, tk.Entry): 8 txt = widget.get() 9 print(txt) 10 var = var_table.get(widget["textvar"]) 11 var.set("") 12 13 14def on_button2(): 15 widget = root.focus_get() 16 # ttk.Entry は tk.Entry を継承しているので tk.Entry と比較しても問題なし 17 #if isinstance(widget, tk.Entry): 18 if isinstance(widget, ttk.Entry): 19 txt = widget.get() 20 print(txt) 21 var = var_table.get(widget["textvar"]) 22 var.set("") 23 24 25root = tk.Tk() 26 27sv1 = tk.StringVar() 28entry1 = tk.Entry(root, textvariable=sv1) 29entry1.grid() 30 31sv2 = tk.StringVar() 32entry2 = ttk.Entry(root, textvariable=sv2) 33entry2.grid() 34 35button1 = tk.Button(root, text="tk.Button", command=on_button1) 36button1.grid() 37 38button2 = ttk.Button(root, text="ttk.Button", command=on_button2) 39button2.grid() 40 41var_table = { 42 str(v): v for v in [sv1, sv2] 43} 44 45root.mainloop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

最後にフォーカスを持ったEntry」を覚えておいて、それをon_button2で参照すればいいのでは。

グローバル変数last_entryに覚えておくとすると、

Python

1last_entry = None 2 3 4def set_last_entry(event): 5 global last_entry 6 last_entry = event.widget

のように、コールバック関数set_last_entryを定義しておきます。

entry1entry2がフォーカスを持ったときに、last_entryにそれぞれのウィジェットオブジェクトが設定されるようにするには、

Python

1entry1.bind("<FocusIn>", set_last_entry) 2entry2.bind("<FocusIn>", set_last_entry)

とします。

あとは、on_button2を少し書き換えて、

diff

1- widget = root.focus_get() 2+ widget = last_entry 3- if isinstance(widget, ttk.Entry): 4+ if isinstance(widget, tk.Entry):

とすれば、想定している動作になるでしょう。なお、if文のインスタンスチェックは、entry1に対しても処理が行なわれるようにtk.Entryで行なう必要があります。

投稿2021/08/24 00:59

Daregada

総合スコア11990

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

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

person

2021/08/24 05:29

ありがとうございます。 isinstance()について、なんか勘違いしてコメント入れてました。 tk.Entryとttk.Entryの両方を見るようにするので、 isinstance(widget, tk.Entry) とするのが正しいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問