Вы генерируете случайное имя только один раз.С этого момента 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
.