Все виджеты Tkinter упакованы в одном кадре - PullRequest
1 голос
/ 20 мая 2019

Я пытаюсь сделать довольно простой графический интерфейс с несколькими окнами.У меня мои окна построены как классы только с меткой в ​​каждом на данный момент.Я не могу понять, почему, когда я запускаю свою программу, она упаковывает все метки в «StartPage», и ни в одном из других окон нет ничего в них.Может быть, у меня неправильно настроены мои классы?

import tkinter as tk


class application(tk.Tk):

def __init__(self, *args, **kwargs):
    tk.Tk.__init__(self, *args, **kwargs)
    container = tk.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 (StartPage, WeeklyBudget, LongtermSavings, Investments):
        frame = F(container, self)
        self.frames[F] = frame

        frame.grid(row=0, column=0, sticky="nsew")


    self.ShowFrame(StartPage)

def ShowFrame(self, cont):
    frame = self.frames[cont]
    frame.tkraise()


class StartPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        start_label = tk.Label(self, text = 'Welcome to Finance Track!')
        start_label.pack()
        week_btn = tk.Button(self, text = 'Weekly Budgeting', command =lambda: controller.ShowFrame(WeeklyBudget))
    savings_btn = tk.Button(self, text = 'Longterm Savings', command = lambda: controller.ShowFrame(LongtermSavings))
    invest_btn = tk.Button(self, text = 'Investments', command = lambda: controller.ShowFrame(Investments))


    week_btn.pack(pady = 10, padx = 10)
    savings_btn.pack(pady = 10, padx = 10)
    invest_btn.pack(pady = 10, padx = 10)

class WeeklyBudget(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(text = 'Welcome to your Weekly Budget')
        label.pack()
        add_btn = tk.Button(text = 'add new week')
        add_btn.pack()

class LongtermSavings(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(text = 'Welcome to your Longterm Savings')

        label.pack()

class Investments(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(text = 'Welcome to your Investments')
        label.pack()

app = application()
app.mainloop()

Текущий результат, как я описал ранее, это всего лишь одно окно со всеми метками и всеми кнопками в нем.

1 Ответ

2 голосов
/ 21 мая 2019

Как упоминал jasonharper, вы не определяете родителей (он же мастер) для многих виджетов.

class Investments(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(text = 'Welcome to your Investments')
        label.pack()

Используя этот класс Investments, например, вашему ярлыку будет присвоено окно, так как его родителипо умолчанию, чтобы установить его родительский элемент для только что созданного фрейма, просто сделайте следующее:

class Investments(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text = 'Welcome to your Investments')
        label.pack()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...