Как вы получаете различное значение для метки каждый раз, когда нажимается кнопка в `tkinter`? - PullRequest
0 голосов
/ 31 декабря 2018

Итак, я делаю генератор случайных имен.Все в значительной степени закончено в моем GUI.Проблема в том, что я могу нажать кнопку «Создать» только один раз, чтобы получить все необходимые значения.Как я могу нажимать кнопку бесконечное количество раз, получая разные значения при каждом нажатии кнопки.

Нужно ли создавать какой-то цикл?Я положил туда lambda.Это удерживает значения от отображения на моем экране, как только вы открываете графический интерфейс.Таким образом, вы можете нажать кнопку, и текст будет выглядеть как обычно.

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 голосов
/ 31 декабря 2018

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

...