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

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

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

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

Tkinter

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

Q&A

解決済

1回答

2161閲覧

Python3 Tkinter エントリのtextvariableに設定されているStringVar()のメソッドを使いたい

person

総合スコア223

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2021/07/08 05:46

編集2021/07/08 05:58

エントリが複数あり、それぞれにStringVar()をtextvariableで設定します。

ボタンを押すと、フォーカスがあたっているエントリに設定されているStringVar()でsetメソッドを使いたいです。
(Entryのdelete()、insert()などは使わないとする。)

ただ、フォーカスがあたっているエントリに設定されているStringVar()の取得ができず、上記の処理ができません。

focused_widget["textvariable"].set("") # Attribute Error: 'str' object has no attribute 'set'
focused_widget["textvariable"].widget.set("") # Attribute Error: 'str' object has no attribute 'widget'

などを試しましたができませんでした。

リストにentryとstringvarを[[entry1, sv1], [entry2, sv2]]のように入れて、
ループでfocus_get()と一致するエントリを割り出してから該当のsvを指定するやり方ならできるのですが、
Entryのインスンタンスentry1、entry2からsv1やsv2を得ることは可能ですか?

Python

1import tkinter as tk 2 3def func(): 4 focused_widget = win.focus_get() 5 if isinstance(focused_widget, tk.Entry): 6 # フォーカスがあたっているエントリのstringVar.set("")をしたい 7 pass 8 9 10win = tk.Tk() 11 12sv1 = tk.StringVar() 13sv2 = tk.StringVar() 14 15entry1 = tk.Entry(win, textvariable=sv1) 16entry1.grid() 17entry2 = tk.Entry(win, textvariable=sv2) 18entry2.grid() 19 20button = tk.Button(win, text="clear", command=func) 21button.grid() 22 23win.mainloop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題の原因は、tkinter の仕様によるもので、
tkinter は tcl/tk と文字列でコマンドをやりとりしていて、
Entry オブジェクトは、実際の Variable オブジェクトを保持しません。

何も指定しない場合は、id のような自動的に振り当てられる識別子を
文字列として管理してます。

フォーカスがあたっているエントリのstringVar.set("")をしたい

消去だけが目的であれば、Variable.set 内部で行ってることと同様の操作を呼び出し。

python

1win.tk.globalsetvar(focused_widget["textvar"], "")

Entryのインスンタンスentry1、entry2からsv1やsv2を得ることは可能ですか?

ウィジェット であれば、nametowidget で所得可能ですが、
Variable, PhotoImage 等の非ウィジェットは対応してません。

tkinter の提供するクラスでは、生成時に name 引数を与えることで、
明示的に tk 側で同じものを指すオブジェクトを作れますが、
VariableやPhotoImage 等は

python

1# Bad?: 期待した挙動をするかもしれないけど、お勧めでないコード 2var = tk.StringVar(name=focused_widget["textvar"]) 3var.set("") 4 5# 但し、同じオブジェクトではないので `sv1 is var` は False 6# `sv1 == var` は文字列比較なのでok

理由は、tkinterの非ウィジェットにはデストラクタが設定されていて、
意図しないタイミングで variable が破棄されてしまうかもしれない。
安全な利用かどうかの確証はない為、お薦めはできません。


解決策としては、Pythonの辞書で管理する方法が確実です。

python

1# 外部で定義しておく 2var_table = { 3 str(v):v for v in [sv1, sv2] 4} 5 6# イベント内 7var = var_table.get(focused_widget["textvar"]) 8var.set("")

投稿2021/07/08 08:35

teamikl

総合スコア8664

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問