Переключение кадра с Menubar в Tkinter - PullRequest
0 голосов
/ 12 декабря 2018

Я новичок в tkinter и пытаюсь узнать, как его использовать, поскольку я искал ответы на то, что я хотел бы сделать в графическом интерфейсе, я натолкнулся на этот пример ЗДЕСЬ , чтобы возиться с переключением междустраницы, затем еще один пример, который я нашел ЗДЕСЬ , чтобы добавить Menubar как класс в окно.

У меня все работало, как я хотел, после нескольких попыток и поисков, чтобы использовать менючтобы переключать кадры вместо использования кнопки, я нашел, как это сделать ЗДЕСЬ и понял этот метод, однако menubar не является классом сам по себе, но определен в классе SampleApp ().не уверен, что лучше иметь menubar как класс или иметь его внутри класса SampleApp ().Я бы хотел, чтобы меню всегда было видно.

Самое близкое, что я мог получить, это вызвать функцию из класса SampleApp (), чтобы поднять фрейм, но вместо этого он открывает новое окно.

Как я могу переключаться между страницами из меню?

любая помощь будет принята с благодарностью, спасибо.

вот код, который у меня есть.вместо переключения кадров открывается другое окно.

#!/usr/bin/python3
from tkinter import *
from tkinter import ttk
from tkinter import font  as tkfont



class SampleApp(Tk):

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

        self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")
        self.title("Window")
        # the container is where we'll stack a bunch of frames
        # on top of each other, then the one we want visible
        # will be raised above the others
        container = Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        for F in (Home_Page, Insert_Page, PageTwo):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame

            # put all of the pages in the same location;
            # the one on the top of the stacking order
            # will be the one that is visible.
            frame.grid(row=0, column=0, sticky="nsew")
        menubar = MenuBar(self)
        self.config(menu=menubar)


        w = 800 # width for the Tk root
        h = 650 # height for the Tk root

        # get screen width and height
        ws = self.winfo_screenwidth() # width of the screen
        hs = self.winfo_screenheight() # height of the screen

        # calculate x and y coordinates for the Tk root window
        x = (ws/4) - (w/2)
        y = (hs/2) - (h/2)

        # set the dimensions of the screen 
        # and where it is placed
        self.geometry('%dx%d+%d+%d' % (w, h, x, y))



        self.show_frame("Home_Page")

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()

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

        filemenu = Menu(self, tearoff=False)
        self.add_cascade(label="File",underline=0, menu=filemenu)
        filemenu.add_command(label="New", command = self.donothing)
        filemenu.add_command(label = "Open", command = self.donothing)
        filemenu.add_command(label = "Save", command = self.donothing)
        filemenu.add_command(label = "Save as...", command = self.donothing)
        filemenu.add_command(label = "Close", command = self.donothing)
        filemenu.add_separator()
        filemenu.add_command(label = "Exit", command = self.quit)

        editmenu = Menu(self, tearoff=False)
        self.add_cascade(label = "Edit", menu = editmenu)
        editmenu.add_command(label = "Undo", command = self.donothing)
        editmenu.add_separator()
        editmenu.add_command(label = "Cut", command = self.donothing)
        editmenu.add_command(label = "Copy", command = self.donothing)
        editmenu.add_command(label = "Paste", command = self.donothing)
        editmenu.add_command(label = "Delete", command = self.donothing)
        editmenu.add_command(label = "Select All", command = self.donothing)

        recordsmenu = Menu(self, tearoff=False)
        self.add_cascade(label="Records", underline=0, menu=recordsmenu)
        recordsmenu.add_command(label="Insert", command=lambda: SampleApp().show_frame("Insert_Page"))
        recordsmenu.add_command(label="Search", command=lambda: SampleApp().show_frame("PageTwo"))

        helpmenu = Menu(self, tearoff=False)
        self.add_cascade(label = "Help", menu = helpmenu)
        helpmenu.add_command(label = "Help Index", command = self.donothing)
        helpmenu.add_command(label = "About...", command = self.donothing)

    def quit(self):
        sys.exit(0)

    def donothing(self):
        filewin = Toplevel()
        button = Button(filewin, text="Do nothing button")
        button.pack()


class Home_Page(Frame):

    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.controller = controller
        label = Label(self, text="Home Page", font=controller.title_font)
        label.pack(side="top", fill="x", pady=10)

        button1 = Button(self, text="Page One", command=lambda: controller.show_frame("Insert_Page"))
        button2 = Button(self, text="Page Two", command=lambda: controller.show_frame("PageTwo"))
        button1.pack()
        button2.pack()


class Insert_Page(Frame):

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

        label = Label(self, text="This is page 1", font=controller.title_font)
        label.pack(side="top", fill="x", pady=10)

        page = ttk.Notebook(self)
        tab1 = ttk.Frame(page)
        tab2 = ttk.Frame(page)
        tab3 = ttk.Frame(page)

        page.add(tab1, text='One')
        page.add(tab2, text='Two')
        page.add(tab3, text='three')

        page.pack(fill=BOTH, expand=1)

        day_label = Label(tab1, text="Tab1:")
        day_label.pack()
        day_label.place(x=0, y=30)
        day_label = Label(tab2, text="Tab2:")
        day_label.pack()
        day_label.place(x=0, y=30)
        day_label = Label(tab3, text="Tab3:")
        day_label.pack()
        day_label.place(x=0, y=30)

        button = Button(self, text="Go to the start page", command=lambda: controller.show_frame("Home_Page"))
        button.pack()


class PageTwo(Frame):

    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.controller = controller
        label = Label(self, text="This is page 2", font=controller.title_font)
        label.pack(side="top", fill="x", pady=10)
        button = Button(self, text="Go to the start page", command=lambda: controller.show_frame("Home_Page"))
        button.pack()


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