【问题标题】:specific menu options in tkinter using classestkinter 中使用类的特定菜单选项
【发布时间】:2017-03-13 16:30:21
【问题描述】:

我已经对此进行了广泛的搜索,但根据我的发现无法获得完整的答案。 我正在使用 tkinter 在 Python3 中编写 GUI。一切都将在课程中进行,包括“菜单”课程。 几个问题 - 我想使用 for 循环来填充我的菜单项和子项(尚未实现)。 - 我想对“容器”类显示的每一帧都执行此操作,但是当这些选项不适用时,我希望菜单中的某些项目被禁用(灰显)。即在没有加载任何内容的情况下启动程序“保存”按钮没有意义,所以我会禁用它,直到创建“新”项目或打开现有项目。

到目前为止我的代码。

import tkinter as tk
from tkinter import ttk, Menu


class MainFrame(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)


        #display manubar
        menubar = MenuBar(self)
        self.config(menu=menubar)

        self.frames = {}

        for F in (StartPage, PageOne, PageTwo):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(StartPage)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()


class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

class PageOne(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = ttk.Label(self, text="Page One", font=LARGE_FONT)
        label.pack(pady=10, padx=10)

        button = ttk.Button(self, text="Visit Page 2",
                            command=lambda: controller.show_frame(PageTwo))
        button1 = ttk.Button(self, text="Go to Start Page",
                             command=lambda: controller.show_frame(StartPage))

        button.pack()
        button1.pack()


class PageTwo(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = ttk.Label(self, text="Page Two", font=LARGE_FONT)
        label.pack(pady=10, padx=10)

        button = ttk.Button(self, text="Visit Page 1",
                            command=lambda: controller.show_frame(PageOne))
        button1 = ttk.Button(self, text="Go to Start Page",
                             command=lambda: controller.show_frame(StartPage))

        button.pack()
        button1.pack()


class MenuBar(tk.Menu):
    def __init__(self, parent):
        tk.Menu.__init__(self, parent)

        fileMenu = tk.Menu(self, tearoff=False)
        self.add_cascade(label="File",underline=0, menu=fileMenu)
        fileMenu.add_command(label="Page One", underline=0,
                             command=self.onexit)
        fileMenu.add_command(label="Page Two", underline=1,
                             command=lambda:self.onexit)
        fileMenu.add_command(label="Exit", underline=1, command=self.onexit)


    def onexit(self):
        quit()

if __name__ == "__main__":
    app = MainFrame()
    app.mainloop()

如何使用文件菜单中的选项调用“PageOne”或“Pagetwo”?出于测试目的,我现在只是退出程序,这样我就可以运行程序而不会出错。

【问题讨论】:

  • 我不确定我是否在您的问题中看到了问题。您是否在问如何让显示“第二页”的菜单项显示 PageTwo 框架?
  • 另外,我们也不想知道整个项目的范围。在大多数情况下,这无关紧要。我们需要的是Minimal, Complete, and Verifiable example。例如,我们不需要版权或不同的字体或背景图像来解决从菜单显示框架的问题。
  • 这是我在 stackoverflow 上的第一篇文章。我已根据您的评论编辑了我的问题/代码。希望这能满足你一点:)。感谢您的提示。我还需要学习很多,未来的问题将更多地取决于stackoverflow标准

标签: python tkinter menu


【解决方案1】:

...我不确定如何使用文件菜单中的选项调用“PageOne”或“Pagetwo”...

就像您的页面一样,MenuBar 对象需要提供对控制器的引用,以便它可以调用控制器函数 show_frame。由于MainFrame 既是“父”又是“控制器”,因此您可以将一个参数用于这两个目的。

class MenuBar(tk.Menu):
    def __init__(self, parent):
        self.controller = parent
        ...
        fileMenu.add_command(..., command=lambda: self.controller.show_frame(PageOne))
        fileMenu.add_command(..., command=lambda: self.controller.show_frame(PageTwo))
        ...

【讨论】:

  • 谢谢布莱恩。我对代码进行了更改,它可以工作。我错过了self.controller = parent 行。我对类很陌生,所以在做继承和子类之类的事情时,我仍然很容易混淆。
猜你喜欢
  • 1970-01-01
  • 2019-03-14
  • 2022-11-02
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多