使用Tkinter

时间:2017-08-22 04:03:50

标签: python tkinter menu tk optionmenu

为了增加我对python的理解和可用性,我一直在从头构建一个文本编辑器。我现在要做的是允许用户更改字体的大小。我使用OptionMenu工作,但是使用它我必须在界面上有一个下拉菜单。我想要做的是以某种方式将选项菜单放在顶栏上的菜单中(使用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]))

1 个答案:

答案 0 :(得分:1)

虽然您可以使用OptionMenu执行此操作,但Tkinter实际上有一个本机Menu对象,我们可以使用它来更清晰地使用更少的代码来实现类似的结果。

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

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个对象menubarmenu。然后,我们将所有命令存储在menu内,这会创建一个带有少量条目的加密Menu对象。

设置每个命令以更改label

的字体大小

然后我们向menubar添加一个级联项,选择预定义的menu作为级联的Menu对象。

root.config(menu=self.menubar用于“绘制”窗口上的Menu对象。

这会在屏幕顶部显示一个级联菜单,菜单中的每个选项都允许我们更改label对象的字体大小。