42

我正在尝试使用模块Entry在 GUI 中使用按钮设置小部件的文本。tkinter

这个 GUI 是为了帮助我将数千个单词分为五类。每个类别都有一个按钮。我希望使用按钮会显着加快我的速度,并且我想每次都仔细检查单词,否则我只会使用按钮并让 GUI 处理当前单词并带来下一个单词。

出于某种原因,命令按钮的行为不像我想要的那样。这是一个例子:

import tkinter as tk
from tkinter import ttk

win = tk.Tk()

v = tk.StringVar()
def setText(word):
    v.set(word)

a = ttk.Button(win, text="plant", command=setText("plant"))
a.pack()
b = ttk.Button(win, text="animal", command=setText("animal"))
b.pack()
c = ttk.Entry(win, textvariable=v)
c.pack()
win.mainloop()

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

4

5 回答 5

93

您可能想使用insert方法。你可以在这里找到 Tkinter Entry Widget 的文档。

此脚本将文本插入Entry. 插入的文本可以在commandButton 的参数中更改。

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()
于 2013-05-04T12:24:52.093 回答
27

如果您使用“文本变量” tk.StringVar(),则可以set()

无需使用条目删除和插入。此外,当条目被禁用或只读时,这些功能不起作用!但是,文本变量方法也可以在这些条件下工作。

import Tkinter as tk

...

entryText = tk.StringVar()
entry = tk.Entry( master, textvariable=entryText )
entryText.set( "Hello World" )
于 2016-02-02T23:21:35.713 回答
2

你的问题是当你这样做时:

a = Button(win, text="plant", command=setText("plant"))

它试图评估为命令设置的内容。所以在实例化Button对象时,它实际上调用了setText("plant"). 这是错误的,因为您还不想调用 setText 方法。然后它获取此调用的返回值(即None),并将其设置为按钮的命令。这就是为什么单击按钮什么都不做的原因,因为没有为它设置命令。

如果您按照 Milan Skála 的建议进行操作并改用 lambda 表达式,那么您的代码将起作用(假设您修复了缩进和括号)。

而不是command=setText("plant")实际调用函数的 , 您可以设置command=lambda:setText("plant")which 指定稍后调用该函数的内容,当您想调用它时。

如果你不喜欢 lambdas,另一种(稍微麻烦一点)的方法是定义一对函数来做你想做的事:

def set_to_plant():
    set_text("plant")
def set_to_animal():
    set_text("animal")

然后你可以使用command=set_to_plantand command=set_to_animal- 这些将评估为相应的函数,但绝对不同于command=set_to_plant()当然会再次评估的函数None

于 2018-06-08T09:28:37.023 回答
1

一种方法是继承一个新类,EntryWithSet并定义set使用类对象deleteinsert方法的方法: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()
于 2018-02-13T22:49:59.163 回答
1
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)
于 2019-07-23T16:29:11.907 回答