每次在tkinter中按下按钮时,如何获得不同的标签值?

时间:2018-12-31 16:50:03

标签: python button tkinter command

因此,我正在创建一个随机名称生成器。一切都在我的GUI中完成。问题是我只能按一次“生成”按钮来获取所有需要的值。如何无限次按下按钮,每次按下按钮都会获得不同的值。

我需要进行某种循环吗?我在其中放了lambda。一旦打开GUI,那将阻止仅显示在我的屏幕上的值。这样,您可以按按钮,文本将像正常情况一样显示。

firstnameli = ['Chris ', 'Kevin ', 'Jeff ', 'Marty ', 'Dolen ']
lastnameli = ['Smith', 'Miller', 'Jones', 'Davis', 'Brown']

full_name = random.choice(firstnameli) + random.choice(lastnameli)

#this allows text to be put in the text box
estr = StringVar()
estr.set(full_name)

fullnameentry = Entry(MyWin, borderwidth=5, font=("Helvetica", 15))

def buttonfunc():
    fullnameentry.config(text=estr)

genbutton = Button(MyWin, text="GENERATE", activebackground="blue", command= lambda: buttonfunc())

1 个答案:

答案 0 :(得分:2)

您只生成一次随机名称。从那时起estr始终是相同的值。

如果您对lambda感到满意,可以使用它来使full_name成为一个函数:

full_name = lambda: random.choice(firstnameli) + random.choice(lastnameli)

然后,您必须调用 full_name,因为它不再是简单的字符串变量,而是一个函数:

estr.set(full_name())

而且,您似乎错过了为textvariable=estr设置fullnameentry的情况。

一切融合在一起:

firstnameli = ['Chris ', 'Kevin ', 'Jeff ', 'Marty ', 'Dolen ']
lastnameli = ['Smith', 'Miller', 'Jones', 'Davis', 'Brown']

full_name = lambda: random.choice(firstnameli) + random.choice(lastnameli)

#this allows text to be put in the text box
estr = StringVar()
estr.set(full_name())

fullnameentry = Entry(MyWin, textvariable=estr, borderwidth=5, font=("Helvetica", 15))

def buttonfunc():
    estr.set(full_name())

genbutton = Button(MyWin, text="GENERATE", activebackground="blue", command=buttonfunc)

我还认为您的代码有时可能有点太复杂。这是一个最小而完整的tkinter示例,也许这会在某种程度上为您提供帮助:

import tkinter as tk
import random

def random_name():
    first_names = ['Chris', 'Kevin', 'Jeff', 'Marty', 'Dolen']
    last_names = ['Smith', 'Miller', 'Jones', 'Davis', 'Brown']
    full_name = '{} {}'.format(random.choice(first_names), random.choice(last_names))
    return full_name

def update_label_and_entry():
    new_random_name = random_name()
    label.config(text=new_random_name)
    entry.delete(0, tk.END) # delete content from 0 to end
    entry.insert(0, new_random_name) # insert new_random_name at position 0

root = tk.Tk()
label = tk.Label(root)
label.pack()
entry = tk.Entry(root)
entry.pack()
button = tk.Button(root, text="New random name", command=update_label_and_entry)
button.pack()
root.mainloop()

当然,这段代码并不完美。例如,可以通过将first_nameslast_names移动到全局名称空间来进一步改进代码,因此其他方法也可以访问这些值。另外,您可以为窗口或标签编写一个包含update_label方法的类。