【问题标题】:How do you get a different value for a label each time a button is pressed in `tkinter`?每次在`tkinter`中按下按钮时,如何获得不同的标签值?
【发布时间】:2019-05-28 02:48:24
【问题描述】:

所以我正在制作一个随机名称生成器。一切都在我的 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())

【问题讨论】:

  • @Jayjayyy 感谢您让我知道。我还有一个问题。无论如何您可以解释如何使用 .tk 将文本放入输入框中?我导入 tkinter 的方式是 from tkinter import * 。这有什么关系吗? (请见谅。我不知道如何使用代码标签。)
  • @Jayjayyy 我用过from tkinter import * 那么我如何导入 tkinter 重要吗?我知道* 意味着一切。所以从tkinter包中导入evrything不仅有意义吗?
  • @Jayjayyy 好的,感谢您的帮助。

标签: python button tkinter command


【解决方案1】:

您只生成一次随机名称。从那时起,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 方法的类。

【讨论】:

  • 我认为您应该将列表存储在全局命名空间中的函数之外。
  • 是的。我认为最好将这些列表放在函数之外的原因是,它们可以被以后开发中可能需要它们的任何代码访问。用于更新名称或其他随机生成器。从易用性的角度来看,我通常将这些列表放在全局中。
  • 是的,我同意类是避免全局命名空间成为最大优势之一的最佳解决方案。在任何情况下。感谢您将该信息添加到您的答案中。
  • 非常感谢你们。您的代码更有条理。但它仍然无法正常工作。我仍然需要在按钮命令上使用 lambda 表达式,这样当我打开我的 GUI 时文本不会显示。我仍然无法无限次按下按钮。只有一次。
  • @Jayjayy 是的,这正是我想要的。因此,生成按钮。如果我不像我的第一个示例那样在按钮命令上放置 lambda 表达式,那么文本就在那里。该按钮根本没有任何功能。几乎什么都没发生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
相关资源
最近更新 更多