Entry
モジュールを使用してGUIのボタンを使用して、tkinter
ウィジェットのテキストを設定しようとしています。
このGUIは、数千の単語を5つのカテゴリに分類するのに役立ちます。各カテゴリにはボタンがあります。ボタンを使用することで大幅にスピードアップすることを望んでいたので、毎回単語をダブルチェックしたい場合は、ボタンを使用してGUIで現在のWordを処理し、次のWordを表示します。
何らかの理由でコマンドボタンが期待どおりに動作しません。これは一例です:
win = Tk()
v = StringVar()
def setText(Word):
v.set(Word)
a = Button(win, text="plant", command=setText("plant")
a.pack()
b = Button(win, text="animal", command=setText("animal"))
b.pack()
c = Entry(win, textvariable=v)
c.pack()
win.mainloop()
これまでのところ、コンパイルできる場合、クリックは何もしません。
insert
メソッドを使用することもできます。
このスクリプトは、Entry
にテキストを挿入します。挿入されたテキストは、ボタンのcommand
パラメーターで変更できます。
from tkinter import *
def set_text(text):
e.delete(0,END)
e.insert(0,text)
return
win = Tk()
e = Entry(win,width=10)
e.pack()
b1 = Button(win,text="animal",command=lambda:set_text("animal"))
b1.pack()
b2 = Button(win,text="plant",command=lambda:set_text("plant"))
b2.pack()
win.mainloop()
「テキスト変数」tk.StringVar()
を使用する場合、set()
することができます。
エントリの削除と挿入を使用する必要はありません。さらに、これらの機能は、エントリが無効または読み取り専用の場合は機能しません!ただし、テキスト変数メソッドは、これらの条件下でも機能します。
import Tkinter as tk
...
entryText = tk.StringVar()
entry = tk.Entry( master, textvariable=entryText )
entryText.set( "Hello World" )
次の2つの方法から選択して、Entry
ウィジェットのテキストを設定できます。例では、インポートされたライブラリ_import tkinter as tk
_およびルートウィンドウroot = tk.Tk()
を想定しています。
方法A:delete
およびinsert
を使用
ウィジェットEntry
は、テキストを新しい値に設定するために使用できるメソッドdelete
およびinsert
を提供します。まず、Entry
から以前の古いテキストを削除する必要があります。delete
には、削除を開始および終了する位置が必要です。古いテキスト全体を削除するため、_0
_で開始し、現在の終了位置で終了します。 END
を介してその値にアクセスできます。その後、Entry
は空になり、_new_text
_を_0
_の位置に挿入できます。
_entry = tk.Entry(root)
new_text = "Example text"
entry.delete(0, tk.END)
entry.insert(0, new_text)
_
方法B:StringVar
を使用
この例では、_entry_text
_という新しいStringVar
オブジェクトを作成する必要があります。また、Entry
ウィジェットは、キーワード引数textvariable
を使用して作成する必要があります。その後、set
で_entry_text
_を変更するたびに、Entry
ウィジェットにテキストが自動的に表示されます。
_entry_text = tk.StringVar()
entry = tk.Entry(root, textvariable=entry_text)
new_text = "Example text"
entry_text.set(new_text)
_
Button
:を介してテキストを設定する両方の方法を含む完全な作業例
このウィンドウ
次の完全な動作例によって生成されます。
_import tkinter as tk
def button_1_click():
# define new text (you can modify this to your needs!)
new_text = "Button 1 clicked!"
# delete content from position 0 to end
entry.delete(0, tk.END)
# insert new_text at position 0
entry.insert(0, new_text)
def button_2_click():
# define new text (you can modify this to your needs!)
new_text = "Button 2 clicked!"
# set connected text variable to new_text
entry_text.set(new_text)
root = tk.Tk()
entry_text = tk.StringVar()
entry = tk.Entry(root, textvariable=entry_text)
button_1 = tk.Button(root, text="Button 1", command=button_1_click)
button_2 = tk.Button(root, text="Button 2", command=button_2_click)
entry.pack(side=tk.TOP)
button_1.pack(side=tk.LEFT)
button_2.pack(side=tk.LEFT)
root.mainloop()
_
1つの方法は、新しいクラスEntryWithSet
を継承し、 set
および delete
を使用するinsert
メソッドを定義することです。Entry
クラスオブジェクトのメソッド:
try: # In order to be able to import tkinter for
import tkinter as tk # either in python 2 or in python 3
except ImportError:
import Tkinter as tk
class EntryWithSet(tk.Entry):
"""
A subclass to Entry that has a set method for setting its text to
a given string, much like a Variable class.
"""
def __init__(self, master, *args, **kwargs):
tk.Entry.__init__(self, master, *args, **kwargs)
def set(self, text_string):
"""
Sets the object's text to text_string.
"""
self.delete('0', 'end')
self.insert('0', text_string)
def on_button_click():
import random, string
Rand_str = ''.join(random.choice(string.ascii_letters) for _ in range(19))
entry.set(Rand_str)
if __name__ == '__main__':
root = tk.Tk()
entry = EntryWithSet(root)
entry.pack()
tk.Button(root, text="Set", command=on_button_click).pack()
tk.mainloop()
e= StringVar()
def fileDialog():
filename = filedialog.askopenfilename(initialdir = "/",title = "Select A
File",filetype = (("jpeg","*.jpg"),("png","*.png"),("All Files","*.*")))
e.set(filename)
la = Entry(self,textvariable = e,width = 30).place(x=230,y=330)
butt=Button(self,text="Browse",width=7,command=fileDialog).place(x=430,y=328)
あなたの問題は、これを行うときです:
_a = Button(win, text="plant", command=setText("plant"))
_
コマンドに設定する内容を評価しようとします。したがって、Button
オブジェクトをインスタンス化するとき、実際にsetText("plant")
を呼び出します。 setTextメソッドをまだ呼び出したくないので、これは間違っています。次に、この呼び出しの戻り値(None
)を取り、それをボタンのコマンドに設定します。ボタンが設定されていないため、ボタンをクリックしても何も起こりません。
MilanSkálaが提案したように、代わりにラムダ式を使用すると、コードが機能します(インデントと括弧を修正すると仮定します)。
実際にcalls関数であるcommand=setText("plant")
の代わりに、後で関数を呼び出したいときに呼び出す関数を指定するcommand=lambda:setText("plant")
を設定できます。
ラムダが気に入らない場合、別の(少し面倒な)方法は、希望することを行う関数のペアを定義することです。
_def set_to_plant():
set_text("plant")
def set_to_animal():
set_text("animal")
_
_command=set_to_plant
_と_command=set_to_animal
_を使用できます-これらは対応する関数に評価されますが、間違いなくnotcommand=set_to_plant()
と同じです。再びNone
に評価します。