Импорт меню из другого модуля в основной модуль в tkinter - PullRequest
0 голосов
/ 05 августа 2020

У меня есть строка меню в модуле views1.py, и я импортирую ее в основной модуль, используя OOP. Я не получаю ни сообщения об ошибке, ни строки меню. Окно открывается как обычно с загруженным другим содержимым. Приложение разрабатывается как пакет со следующей структурой каталогов:

Главный каталог содержит два файла main.py и README.rst и каталог с именем нижний регистр main. Этот каталог строчные main содержит файлы views1.py, controller.py и model.py.

1. Main directory
    - main.py
    - README.rst
    - main directory
        * views1.py
        * model.py
        * controller.py

main.py

    from tkinter import Tk
    import tkinter as tk
    import controller
    import views1
    from tkinter import *
    from views1 import Views1, Views2



    class AIcvmaker(tk.Tk):
        def __init__(self, *args, **kwargs):
            tk.Tk.__init__(self, *args, **kwargs)
            self.Views2 = views1.Views2(tk)


            self.title("Cleopatra CV Maker")
            self.geometry("1400x800")
    
            #Add a view
            Views2(self)
            Views1(self).grid(sticky = (tk.E))
            self.columnconfigure(0, weight=1)

    

    root = AIcvmaker()
    root.mainloop()  

views1.py

    from tkinter import Tk
    import tkinter as tk
    from tkinter import *
    from tkinter import messagebox
    import controller

    #code edited for Views1()
    class Views1(tk.Frame):

        def __init__(self, parent, *args, **kwargs):
            super().__init__(parent, *args, **kwargs)

            self.controller = controller
            self.parent = parent
            self.cv_maker_Base()

        def cv_maker_Base(self):
            self.create_Rightframe()



        def create_Rightframe(self):
    
            self.pad_label = ttk.Label(self, text = "Push a button")
            self.activate_Button = ttk.Button(self, text = "Activate software")
            self.pad_label.grid(row=0, column=1, padx = 8, pady = 8)
            self.activate_Button.grid(row=1, column=1, padx = 8, pady = 8)
            self.columnconfigure(1, weight = 1)        

    #ADDING AN EXTRA self to super()
    class Views2(tk.Menu):
        def __init__(self, parent):
            super().__init__(self, parent)
            self.parent = parent
            self.create_Topmenu()

        def create_Topmenu(self):
            self.menu_bar = Menu(self.parent)
            self.create_Filemenu()
            self.create_Editmenu()
            self.create_Viewmenu()
            self.create_Aboutmenu()



        def create_Filemenu(self):

            self.filemenu = Menu(self.menu_bar, tearoff = 0)
            self.filemenu.add_command(label="New", command = lambda: fNew())
            self.filemenu.add_command(label="Open", command= lambda: fOpen())
            self.filemenu.add_separator()
            self.filemenu.add_command(label="Save", command= lambda: fSave())
            self.filemenu.add_command(label="Exit", command=quit)
            self.menu_bar.add_cascade(label="File", menu=self.filemenu)

        def create_Editmenu(self):
            pass

        def create_Viewmenu(self):
            pass
        def create_Aboutmenu(self):
            pass

        def fNew(self):
            pass
        def fOpen(self):
            pass
        def fSave(self):
            pass

Я попытался написать tk.Menu в методе инициализации Views2 () и попытался изменить self на parent, похоже, это не работает. Я работаю над написанием MVC, поскольку код очень длинный, и это помогло бы снизить сложность.

1 Ответ

0 голосов
/ 05 августа 2020

Вы забываете отобразить меню, используя:

self.parent.config(menu=self.filemenu)

Под функцией create_Filemenu:

def create_Filemenu(self):
    self.filemenu = Menu(self.menu_bar, tearoff = 0)
    self.filemenu.add_command(label="New", command = lambda: self.fNew())
    self.filemenu.add_command(label="Open", command= lambda: self.fOpen())
    self.filemenu.add_separator()
    self.filemenu.add_command(label="Save", command= lambda: self.fSave())
    self.filemenu.add_command(label="Exit", command=quit)
    self.menu_bar.add_cascade(label="File", menu=self.filemenu)
    
    # display the menu
    self.parent.config(menu=self.filemenu)

Обратите внимание, что я изменил некоторые строки кода, которые были неправильными чтобы заставить его работать, например, комментируя self.Views2 = views1.Views2(tk), которому вы должны передать self, а не tk. Или импортировав ttk в файл views1.py. Также изменяется, например, с fNew() на self.fNew().

Вывод:

введите описание изображения здесь

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