如何使用tkinter中的按钮设置`Entry`小部件的文本/值/内容

时间:2013-05-04 11:42:19

标签: python events tkinter tkinter-entry

我正在尝试使用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()

到目前为止,当我能够编译时,点击什么都不做。

6 个答案:

答案 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:使用deleteinsert

    小部件Entry提供了方法deleteinsert,可用于将其文本设置为新值。首先,您必须使用Entrydelete删除所有以前的旧文本,这需要开始和结束删除的位置。由于我们要删除完整的旧文本,因此我们从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设置文本的两种方法:

    此窗口

    screenshot

    由以下完整的工作示例生成:

    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方法,该方法利用deleteinsertEntry方法类对象:

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_plantcommand=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)