Класс страницы Python Tkinter в разных файлах - PullRequest
0 голосов
/ 02 июля 2018

Итак, я пытаюсь получить кнопку на моем PageOne (в отдельном файле), чтобы перенаправить меня на StartPage. Однако я не могу заставить его работать. Как передать класс PageOne на страницу StartPage?

Код:

import tkinter as tk
from testPage import PageOne

LARGE_FONT = ('Verdana', 12)  # font's family is Verdana, font's size is 12


class MainWindow(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.title('cool')  # set the title of the main window
        self.geometry('300x300')  # set size of the main window to 300x300 pixels

        # this container contains all the pages
        container = tk.Frame(self)
        container.pack(side='top', fill =  'both', expand = True)
        container.grid_rowconfigure(0, weight=1)  # make the cell in grid cover the entire window
        container.grid_columnconfigure(0, weight=1)  # make the cell in grid cover the entire window
        self.frames = {}  # these are pages we want to navigate to

        for F in (StartPage, PageOne):  # for each page
            frame = F(container, self)  # create the page
            self.frames[F] = frame  # store into frames
            frame.grid(row=0, column=0, sticky='nsew')  # grid it to container

            self.show_frame(StartPage)  # let the first page is StartPage

    def show_frame(self, name):
        frame = self.frames[name]
        frame.tkraise()

class StartPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text='Start Page', font=LARGE_FONT)
        label.pack(pady=10, padx=10)  # center alignment

        button1 = tk.Button(self, text='Visit Page 1',  # when click on this button, call the show_frame method to make PageOne appear
                            command=lambda: controller.show_frame(PageOne))
        button1.pack()  # pack it in

app = MainWindow()
app.mainloop()

тогда мой модуль FirstPage:

import tkinter as tk
from DashMenu import StartPage

LARGE_FONT = ('Verdana', 12)

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

        button1 = tk.Button(self, text='Back to Home',  # likewise StartPage
                            command=lambda: controller.show_frame(StartPage))
        button1.pack()

Таким образом, этот метод получения этого кода возвращает этот код ошибки: ImportError: cannot import name 'PageOne'

Я также пытался передать StartPage, parent и controller в PageOne при вызове, но я получил ошибку, возможно, я сделал это неправильно? это правильный способ сделать это?

Как правильно настроить StartPage моего импорта PageOne? и наоборот?


Обновление:

новая структура кода, которую я пробовал.

page.py

import tkinter as tk

class Page(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
    def show(self):
        self.lift()

Dashboard.py

import tkinter as tk
from pageOne import PageOne
from pageTwo import PageTwo

class MainWindow(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.title('cool')  # set the title of the main window
        self.geometry('300x300')  # set size of the main window to 300x300 pixels

        # this container contains all the pages
        container = tk.Frame(self)
        container.pack(side='top', fill =  'both', expand = True)
        container.grid_rowconfigure(0, weight=1)  # make the cell in grid cover the entire window
        container.grid_columnconfigure(0, weight=1)  # make the cell in grid cover the entire window
        self.frames = {}  # these are pages we want to navigate to

        for F in (PageOne, PageTwo):  # for each page
            frame = F(container, self)  # create the page
            self.frames[F] = frame  # store into frames
            frame.grid(row=0, column=0, sticky='nsew')  # grid it to container

            self.show_frame(PageOne)  # let the first page is StartPage

    def show_frame(self, name):
        frame = self.frames[name]
        frame.tkraise()

pageOne.py

import tkinter as tk
from page import Page

class PageOne(Page):
   def __init__(self, *args, **kwargs):
       Page.__init__(self, *args, **kwargs)
       label = tk.Label(self, text="This is page 1")
       label.pack(side="top", fill="both", expand=True)
       print("pgone")

pageTwo.py

import tkinter as tk
from page import Page

class PageTwo(Page):
   def __init__(self, *args, **kwargs):
       Page.__init__(self, *args, **kwargs)
       label = tk.Label(self, text="This is page 2")
       label.pack(side="top", fill="both", expand=True)

поэтому я запустил приведенный выше код и, к сожалению, получил ошибки. За исключением того, что у меня нет окна вывода с какими-либо страницами, я буду продолжать искать, почему. Есть предложения?

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