【问题标题】:How to create a combobox that includes checkbox for each item?如何创建一个包含每个项目的复选框的组合框?
【发布时间】:2015-05-15 04:46:24
【问题描述】:

对 tkinter 和 python 还很陌生,我想知道如何实现这样的按钮:

  • 点击按钮下拉列表(所以这是一个组合框)
  • 列表的每一行都有一个复选框。
  • 最后,如果单击复选框,则运行一个函数,或者(甚至更好)一旦不再删除组合框,运行一个将项目检查为 args 的函数。

更新

按钮/菜单按钮必须充当过滤器。当下拉菜单时,用户可以取消选中他不想要的多个选项(每次单击项目时菜单不会消失)。因此,能够看到复选框非常重要,以便用户知道哪些选项当前处于活动状态。

我最终通过创建一个顶级框架来使用 Bryan 的想法。这是我所拥有的:

【问题讨论】:

  • 我不认为使用Combobox 小部件可以做到这一点。当然,可能有解决方法或其他解决方案...
  • 这就是我告诉自己的原因,当我在组合框中放置一个检查按钮小部件时,它显示 .4335930840 而不是检查按钮
  • @Lich4r 此代码是否作为模块公开提供?如果没有,你可以把它放在这里还是作为一个要点,如果你还有它?非常感谢:)
  • @evn 我找到了我的文件(我已经停止编码)。事情在我的mac(py 3.5.3)上运行良好,但框架并没有真正显示在windows(py 3.9)上。我怎样才能分享给你?
  • @Lich4r 如果可行,请随时通过电子邮件发送:ebinder@stevens.edu。非常感谢!

标签: python tkinter


【解决方案1】:

我不认为OptionMenu 旨在容纳除字符串之外的任何东西。听起来您想要Listbox 的功能,它具有允许多项选择、获取所有选定项目等选项。

这会在包含的菜单中为您提供带有 复选框OptionMenu。检查您喜欢的任何项目,然后在 tkinter 窗口中右键单击以将复选框的值打印到控制台。

from tkinter import *

master = Tk()

var = StringVar(master)
var.set("Check")
w = OptionMenu(master, variable = var, value="options:")
w.pack()
first = BooleanVar()
second = BooleanVar()
third = BooleanVar()
w['menu'].add_checkbutton(label="First", onvalue=True, 
                          offvalue=False, variable=first)
w['menu'].add_checkbutton(label="Second", onvalue=True, 
                          offvalue=False, variable=second)
w['menu'].add_checkbutton(label="Third", onvalue=1, 
                          offvalue=False, variable=third)


master.bind('<Button-3>', lambda x: print("First:", first.get(), " Second:", 
           second.get(), " - Third:", third.get()))
mainloop()

另见this

【讨论】:

  • 列表框不适合这里,因为它不能被“下拉”。我希望列表仅在用户单击按钮时出现
  • 看起来 (stackoverflow.com/questions/17580218/…) 您可以使用 my_optionmenu['menu'] 访问包含在 OptionMenu 中的 Menu 小部件,允许您使用 Menu 方法 (effbot.org/tkinterbook/menu.htm) 添加各种小部件 - 例如 Checkbuttons - 到那个菜单。
  • 与上述相同的问题。我没有看到复选框
  • 没有经典的复选框(即,单击时变为灰色并在发布时显示检查的白色框),但选中的项目旁边确实出现了检查。至于通过选择保持菜单,目前我能想到的最多的是将每个项目绑定到再次弹出菜单的回调,但我不知道如何以编程方式打开菜单。
  • 我没有看到任何支票出现。如果我这样做,我将永远无法关闭菜单^^
【解决方案2】:

没有小部件可以做你想做的事。您必须创建一个带有一堆复选按钮的顶层窗口。然后,您可以使用普通按钮触发外观。

【讨论】:

  • 我知道 Bryan 会想出一个答案:P 看看你的代码,这几乎是完美的。唯一的问题是我没有看到复选框,并且当单击项目菜单时菜单消失。我将更新我的问题以提供更多上下文
  • 我为什么要创建另一个窗口?我正在考虑创建一个框架并将所有复选按钮放入其中,但我绝对不知道如何在不移动该按钮下方的所有内容的情况下从按钮“下拉”框架。该框架必须出现在所有现有的其他小部件之上。这就是“顶级窗口”的意思吗?
  • @FromBabylon:如果需要,您可以使用框架。您可以使用place 几何管理器模拟它的下拉。使用顶层窗口的优点是它是一个 i 依赖窗口。例如,E 用户可以将其保持打开状态并将其移至单独的监视器。
  • 我从来没有用过place,所以我要去看看。但是我的应用程序主要使用网格和包装来处理某些容器。我正在做的“应用程序”是一个 Logviewer。因此,如果用户必须打开一个新窗口来选择它的过滤器,那并不是很方便。在为当前的文件浏览器(例如列表或网格)选择哪个视图之前考虑打开一个新窗口,这会很糟糕^^在现有窗口顶部有一个简单的按钮会更方便!如果我能够看到检查按钮文本旁边的小检查但我看不到它们,那么“菜单解决方案”可能会很好。..
  • 我一直在尝试使用 place 来拖动包含复选按钮的框架,但没有成功。如果框架的父级是其他小部件的“主父级”,我可以轻松地在单击其他小部件顶部的按钮时显示一个新框架,但这假设我还使用 place 作为“主父级”中其他小部件的管理器,即在我的应用程序中并非如此。另外,如何在窗口中获取给定小部件的当前 x、y 坐标,以便将框架正确放置在按钮下方?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
相关资源
最近更新 更多