我正在尝试使用Entry
模块使用GUI中的按钮设置tkinter
窗口小部件的文本。
此GUI旨在帮助我将数千个单词分为五类。每个类别都有一个按钮。我希望使用一个按钮可以显着加快我的速度,我希望每次都仔细检查这些单词,否则我只会使用按钮并让GUI处理当前单词并带来下一个单词。
由于某种原因,命令按钮的行为不像我想要的那样。这是一个例子:
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()
到目前为止,当我能够编译时,点击什么都不做。
答案 0 :(得分:42)
您可能希望使用insert
方法。
此脚本将文本插入Entry
。可以在Button的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()
答案 1 :(得分:9)
如果您使用"文本变量" tk.StringVar()
,你可以set()
。
无需使用Entry删除和插入。此外,当条目被禁用或只读时,这些功能不起作用!但是,文本变量方法在这些条件下也能正常工作。
import Tkinter as tk
...
entryText = tk.StringVar()
entry = tk.Entry( master, textvariable=entryText )
entryText.set( "Hello World" )
答案 2 :(得分: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
在示例中,您必须创建一个名为StringVar
的新entry_text
对象。另外,必须使用关键字参数Entry
创建textvariable
小部件。之后,每次用entry_text
更改set
时,文本将自动显示在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()
答案 3 :(得分: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()
答案 4 :(得分:0)
你的问题是当你这样做时:
a = Button(win, text="plant", command=setText("plant"))
它尝试评估为命令设置的内容。因此,在实例化Button
对象时,它实际上会调用setText("plant")
。这是错误的,因为您还不想调用setText方法。然后它接受此调用的返回值(即None
),并将其设置为按钮的命令。这就是为什么点击按钮什么都不做,因为没有为它设置命令。
如果您按照米兰Skála的建议改为使用lambda表达式,那么您的代码将起作用(假设您修复了缩进和括号)。
而不是command=setText("plant")
,实际上调用该函数,您可以设置command=lambda:setText("plant")
,它指定稍后调用该函数的内容,当您想要调用它时。 / p>
如果你不喜欢lambdas,另一种(稍微麻烦的)方法是定义一对函数来做你想做的事情:
def set_to_plant():
set_text("plant")
def set_to_animal():
set_text("animal")
然后您可以使用command=set_to_plant
和command=set_to_animal
- 这些将评估相应的功能,但肯定不与command=set_to_plant()
相同课程再次评估为None
。
答案 5 :(得分:0)
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)