使用Tkinter在Python中将OptionMenu用作菜单

使用Tkinter在Python中将OptionMenu用作菜单,python,tkinter,menu,tk,optionmenu,Python,Tkinter,Menu,Tk,Optionmenu,为了提高我对python的理解和可用性,我从头开始构建了一个文本编辑器。我现在要做的是允许用户更改字体大小。我有这个工作使用一个选项菜单,但通过使用它,我必须有一个下拉界面。我想做的是将选项菜单放在顶栏的菜单中(使用file_menu=menu(root))并使其看起来像一个级联。我没有确切的代码,因为我在手机上,远离我的笔记本电脑,但我一直在思考如何做到这一点,我无法找到它,也无法在搜索之前找到它。提前谢谢 编辑:我知道怎么做了,我很抱歉没有我的原始代码。我的原始代码类似于我下面发布的答案,但

为了提高我对python的理解和可用性,我从头开始构建了一个文本编辑器。我现在要做的是允许用户更改字体大小。我有这个工作使用一个选项菜单,但通过使用它,我必须有一个下拉界面。我想做的是将选项菜单放在顶栏的菜单中(使用file_menu=menu(root))并使其看起来像一个级联。我没有确切的代码,因为我在手机上,远离我的笔记本电脑,但我一直在思考如何做到这一点,我无法找到它,也无法在搜索之前找到它。提前谢谢

编辑:我知道怎么做了,我很抱歉没有我的原始代码。我的原始代码类似于我下面发布的答案,但我想让用户选择8-40的字体大小

font_size.add_command(label='8', command=lambda: font_size_changer(8))
font_size.add_command(label='10', command=lambda: font_size_changer(10))
font_size.add_command(label='12', command=lambda: font_size_changer(12))
只是我想要多少看起来很糟糕。我最终没有使用OptionMenu和IntVar(),而是使用了如下的for循环:

def font_size_changer(clicked_size):
    global current_font_size
    current_font_size = clicked_size
    text.config(font=(current_font, current_font_size, style_combo))

sizes_list = [8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30]
font_size = Menu(menu)
font_menu.add_cascade(label="Font Size", menu=font_size)
for x in range(0, len(sizes_list)):
    font_size.add_command(label=str(sizes_list[x]), command=lambda: font_size_changer(sizes_list[x]))

虽然您可以使用
选项菜单
来执行此操作,但Tkinter实际上有一个本机
菜单
对象,我们可以使用它以更少的代码更干净地实现类似的结果

这实际上并不太棘手,请参见下面的示例:

import tkinter as tk

class App:
    def __init__(self, root):
        self.root = root
        self.label = tk.Label(self.root, text="Lorem Ipsum", font=("Comic Sans MS", 44))
        self.menubar = tk.Menu(self.root)
        self.menu = tk.Menu(self.root, tearoff=0)
        self.menu.add_command(label="Small", command=lambda:self.label.config(font=("Comic Sans MS", 22)))
        self.menu.add_command(label="Medium", command=lambda:self.label.config(font=("Comic Sans MS", 44)))
        self.menu.add_command(label="Big", command=lambda:self.label.config(font=("Comic Sans MS", 66)))
        self.menubar.add_cascade(label="Size", menu=self.menu)
        self.root.config(menu=self.menubar)
        self.label.pack()

root = tk.Tk()
App(root)
root.mainloop()
让我们把它分解一下

我们创建两个
Menu
对象
menubar
Menu
。然后,我们将所有命令存储在
菜单
中,这将创建一个充实的
菜单
对象,其中包含一些条目

每个命令都设置为更改
标签的字体大小

然后,我们将一个级联项添加到
菜单栏
中,选择预定义的
菜单
作为级联的
菜单
对象

然后使用
root.config(menu=self.menubar
在窗口上“绘制”
菜单
对象


这将导致屏幕顶部出现一个层叠菜单,菜单中的每个选项都允许我们更改
标签
对象的字体大小。

欢迎使用stack overflow。我知道您问这个问题时不在计算机旁,但这并不能改变您应该提供一个示例以便我们理解的事实你到目前为止做了什么,并根据这些代码提供反馈。你不应该在没有MCVE或没有适当上下文的情况下提出问题,而应该等到你能提供MCVE后再提出你的问题。