たとえば、エントリなどの値を取得するために働く普遍的な関数を作ることはできますか?このようなエントリ、コンボボックス、テキストから値を取得するユニバーサル関数
何か:最もTkinterのテキスト機能のヘルプ
たとえば、エントリなどの値を取得するために働く普遍的な関数を作ることはできますか?このようなエントリ、コンボボックス、テキストから値を取得するユニバーサル関数
何か:最もTkinterのテキスト機能のヘルプ
いいえ、そうではありません。ただし、次のような関数を定義することができます
def uni_get(widget):
wgt_typ = type(widget).__name__
if wgt_typ == 'Label' or wgt_typ == 'Button':
disp_str = widget['text']
elif wgt_typ == 'Text':
disp_str = widget.get('1.0', 'end-1c')
elif wgt_typ == 'Combobox' or wgt_typ == 'Entry':
disp_str = widget.get()
return disp_str
デモ例:
import tkinter as tk
from tkinter import ttk
def uni_get():
#to dynamically update the selected widget passed to uni_get
global cbb
widget = root.winfo_children()[cbb.current()]
wgt_typ = type(widget).__name__
if wgt_typ == 'Label' or wgt_typ == 'Button':
disp_str = widget['text']
elif wgt_typ == 'Text':
disp_str = widget.get('1.0', 'end-1c')
elif wgt_typ == 'Combobox' or wgt_typ == 'Entry':
disp_str = widget.get()
print(disp_str)
root = tk.Tk()
cbb = ttk.Combobox(root)
ent = tk.Entry(root)
txt = tk.Text(root)
lbl = tk.Label(root)
btn = tk.Button(root, command=uni_get)
### default widget configs ###
cbb['values'] = ["Combobox", "Entry", "Text", "Label", "Button"]
cbb.current(0)
ent.insert('0', "Entry")
txt.insert('1.0', "Text")
lbl['text'] = "Label"
btn['text'] = "Button"
### layout ###
cbb.pack()
ent.pack()
txt.pack()
lbl.pack()
btn.pack()
root.mainloop()
このエラーが発生しました: '例外Tkinterコールバックで トレースバック(最近の呼び出し最後): ファイル" C:\ Users \ AppData \ Local \ Programs \ Python \ Python36-32 \ lib \ tkinter \ __ init__.py " 、行1699、__call__ return self.func(* args) ファイル "C:¥Users¥User¥Desktop¥PyEngine¥gui.py"、行75、保存中 x1 = uni_get(X) ファイル "C :\ Users \ User \ Desktop \ PyEngine \ gui.py "、行70、uni_get print(disp_str) UnboundLocalError:代入前にローカル変数 'disp_str'が参照されています。 ' –
関数を変更する際には間違いがあります。あなたの関数に 'global disp_str'を最初の行として追加してみてください。 – Nae
エラーが見つかりました。別の機能にありました。今、それはあなたに非常に感謝します! –
ため
def returnInput(obj):
_x = StringVar()
obj.configure(textvariable=_x)
return str(_x.get())
おかげで、VAR = obj.get()は、一部の例外を除いて、最も頻繁に動作します。例えば
:
entry.get()
listbox.get(listbox.curselection())
またはコンボボックスのためexportselection。
これらのメソッドを使用するのは、関数を作成するよりもはるかに簡単です。
最初のステートメントはfalseです。 'obj.get()'はEntryウィジェット(と '* Var'クラス)でのみ動作します。 'get()'を使う他のウィジェットは、1つ以上の引数を必要とします。 –
これは、変数の代入を使用するときに関数を使用することについての私の主張を簡単に証明します。 –
あなたのコードでは意味をなさない - それはオブジェクトに何かを入れ誰かの前に 'StringVar'からデータを取得します。最初は 'StringVar'を' Entry'に代入する必要がありますが、 'StringVar'から別の瞬間に値を取得します。 – furas