Мой унаследованный класс MenuBar (tk.Menu) не показывает Menubar - PullRequest
0 голосов
/ 05 ноября 2018

Я пытался добавить главное меню в мою программу, и у меня возникли проблемы с ним. Я не совсем понимаю структуру классов python3, так как я довольно новичок в программировании с ним. Я работаю на Ubuntu 18.04 и вот код, с которым у меня проблемы.

#! /usr/bin/env python3

import tkinter as tk
from tkinter import *

class Application(tk.Tk):

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

        menubar = MenuBar(self)
        self.config(menu=menubar)

    def quitButton(self):
        self.destroy()

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

        menubar = tk.Menu(self, tearoff=False)
        filemenu = tk.Menu(menubar, tearoff=0)
        filemenu.add_command(label="Test", command=self.test_Test)
        filemenu.add_separator()
        filemenu.add_command(label="Exit", command=lambda:    self.controller.quitButton())
        menubar.add_cascade(label="File", menu=filemenu)

    def test_Test(self):
        print("This is a test")

if __name__ == "__main__":
    app = Application()
    app.title("test") 
    app.mainloop()

Меню файлов не отображается для меня. Любая помощь?

1 Ответ

0 голосов
/ 05 ноября 2018

Вопрос : tkinter ... не отображается главное меню

Здесь есть пара проблем.

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

Здесь вы создаете новый tk.Menu(... с родителем == self.
Переменная menubar содержит объект tk.Menu(....

    menubar = tk.Menu(self, tearoff=False)

A class __init__ метод возвращается сам, поэтому вы не возвращаете новый menubar.
Вы возвращаете class MenuBar(tk.Menu) объект, который является пустым !

изменить на

class MenuBar(tk.Menu):
    def __init__(self, parent):
  • Ваш class MenuBar - новый menubar! Поэтому параметры init идут сюда

        tk.Menu.__init__(self, parent, tearoff=False)
    
  • Подменю parent - это класс, поэтому передайте self.

        filemenu = tk.Menu(self, tearoff=0)
    
  • Добавить filemenu использованных предметов

        filemenu.add_command(label="Test", command=self.test_Test)
        filemenu.add_separator()
        filemenu.add_command(label="Exit", command=lambda: self.controller.quitButton())
    
  • Добавьте подменю к этому объекту, поэтому используйте self.add....

        self.add_cascade(label="File", menu=filemenu)
    

Вы можете .config(... в течение class MenuBar делать:

        parent.config(menu=self)

Протестировано на Python: 3,5 - TkVersion ': 8,6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...