因此,我正在创建一个随机名称生成器。一切都在我的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())
答案 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_names
和last_names
移动到全局名称空间来进一步改进代码,因此其他方法也可以访问这些值。另外,您可以为窗口或标签编写一个包含update_label
方法的类。