【问题标题】:Is it possible take user text input in a Tkinter dropdown menu? If so, how?是否可以在 Tkinter 下拉菜单中输入用户文本?如果是这样,怎么做?
【发布时间】:2018-03-12 15:45:50
【问题描述】:

这是我尝试过的:

win = Tk()
menubar = Menu(win)
dropDown = Menu(menubar)
dropDown.add_command(label = "Do something", command = ...)

entry = Entry()
dropDown.add(entry)

menubar.add_cascade(label = "Drop Down", menu = dropDown)
win.config(menu = menubar)
win.update()

我查看了文档,似乎没有办法用像dropDown.add_entry(...) 这样的单行来做到这一点,但我认为可能有一种解决方法,比如使用几何管理器将条目放入菜单。

我正在使用 Python 3.6(但我没有标记它,因为我会从 Python 标记中获得一千个没有兴趣回答我的问题投票无缘无故关闭的 mod)

【问题讨论】:

  • 你可以做我做的。创建新的菜单项,然后具有删除然后重新创建菜单的功能。这样您就可以添加或删除菜单项。我有一个笔记程序,可以防止我通过菜单添加或删除新的笔记集。
  • 我有一个名为New 的菜单命令,它链接到运行simpledialog.askstring() 的函数。我从这个askstring() 中获取用户输入来为新文件名创建我的变量,然后函数创建文件。您可以使用相同的概念在 GUI 中执行多种任务,包括向菜单添加新项目。不过,您将需要另一个更新菜单的功能。
  • @Nae 问题具体是“文本输入”

标签: python tkinter tkinter-entry


【解决方案1】:

不,没有办法使用标准菜单来获得一个接受用户输入的菜单。这根本不是菜单设计的工作方式。

如果你需要用户输入一个字符串,你需要使用一个对话框。

【讨论】:

  • 这很有趣,因为至少在美学上,Tkinter 菜单与旧窗口下拉菜单相同,而且我很确定它们有文本输入(例如在选择特定字体大小时)。相似度纯粹是视觉上的吗?
  • @RegulationHeadgear 如果我没记错的话,Tkinter 使用窗口来定义小部件的主题。但据我所知,Tkinter 与旧 Windows 菜单的相似之处只是视觉上的。
  • @Mike-SMT:在 OSX 和 Windows 上,tkinter 使用平台提供的本机菜单小部件。它们是实际的窗口或 osx 菜单。
  • @BryanOakley 感谢您的澄清。我没有意识到它们是来自操作系统的实际菜单,而不仅仅是主题。
【解决方案2】:

这是一个简单的程序,您可以在其中单击菜单按钮以提示用户输入。然后用那个输入做一些事情。在这种情况下打印到控制台。

我们需要编写一个函数,利用来自simpledialogaskstring(),您可以从Tkinter 导入该函数。然后获取用户键入的字符串的结果并对其进行处理。

import tkinter as tk
from tkinter import simpledialog


win = tk.Tk()
win.geometry("100x50")

def take_user_input_for_something():
    user_input = simpledialog.askstring("Pop up for user input!", "What do you want to ask the user to input here?")
    if user_input != "":
        print(user_input)

menubar = tk.Menu(win)
dropDown = tk.Menu(menubar, tearoff = 0)
dropDown.add_command(label = "Do something", command = take_user_input_for_something)

# this entry field is not really needed her.
# however I noticed you did not define this widget correctly
# so I put this in to give you an example.
my_entry = tk.Entry(win)
my_entry.pack()

menubar.add_cascade(label = "Drop Down", menu = dropDown)
win.config(menu = menubar)

win.mainloop()

【讨论】:

  • 感谢您在 simpledialog 上提示我,我对此一无所知。这将在未来为我节省大量时间。
  • 我敢打赌,如果我(或某人)可能会被打扰,则可以将其中一个对话框打包为在单击某个菜单时始终出现在该菜单中。不过,我不是最擅长使用几何管理器,所以也许不是我。
  • 您可以使用Toplevel() 创建一个自定义弹出窗口,当您单击菜单按钮时,该窗口可能很小且是一个简单的输入字段。您需要一些解决方法我相信Toplevel()可以在这方面提供帮助。
  • 如果我能更详细地了解您正在尝试做什么,我可能会给您一些可行的想法。
  • 您最初的回答解决了我的问题。我的程序有一个“另存为”功能,并且,为了输入名称,我可以让菜单调用一个 Toplevel,里面有一个 Entry 和一个按钮,但是(根据过去的经验)这对于我可能会遇到的事情来说是一个巨大的痛苦也只需使用 input() ,所以我想知道是否有更有效的方法。你的回答提供了这一点。我只问我这样做的方式,因为我认为它更有可能得到回答。
猜你喜欢
  • 2012-06-19
  • 1970-01-01
  • 2013-04-02
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多