Метка, появляющаяся в нескольких кадрах/windows tkinter

#python #tkinter

Вопрос:

Я создаю приложение-планировщик в Tkinter с несколькими рамками/окнами. На AddPage экране пользователь может ввести текст и нажать add assessmentкнопку. label Затем A отобразит то, что они ввели в поле HomePage . У меня это работает, однако метка отображается на всех страницах, а не только на HomePage них . Я полагаю, что это может быть связано с тем фактом, что я упаковываю label его в display функцию, вместо того, чтобы иметь уже существующую label на HomePage . Я сделал это таким образом, чтобы люди могли добавлять несколько оценок. У кого-нибудь есть какие-либо решения о том, как отображать label только на HomePage ?

 import calendar
import tkinter as tk
from tkinter import ttk
from tkcalendar import *
from datetime import datetime


#calendar and display in label

#window = Tk()

#window.title("StudyFriendO")

IMAGE_PATH = 'apple.png'
LARGE_FONT= ("Verdana", 24)

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

        self.title("StudyFriendO") #naming window title
        self.geometry('850x830') #size of window

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        #### ADDED
        self.shared_data = {  # Variables shared by all pages.
            'name': tk.StringVar(value=''),
            'assessment': tk.StringVar(value='')
        }

        self.frames = {}

        for F in (StartPage, HomePage, ToDoPage, TimetablePage, AddPage): #list of multiple frames of program
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(StartPage)

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

    def set_date(self, cont):
        #frame: StartPage = self.frames[cont]
        #frame.date_label.config(text="Today's date is "   datetime.today().strftime("%B %d, %Y")) #function to get date from
        frame2: HomePage = self.frames[HomePage]
        frame2.date_label.config(text= datetime.today().strftime("%B %d, %Y")) #function to get date from

    def getname(self, cont): #FUNCTION WHICH GRABS NAME FROM TEXT ENTRY
        frame2: HomePage = self.frames[HomePage]
####     frame2.name_label.configure(text=nameentry.get()   "'s Planner ")
        frame2.name_label.configure(text=self.shared_data['name'].get()   "'s Planner ")

    def display(self, cont):
        frame2: HomePage = self.frames[HomePage]
        frame2.n = tk.Label(self, text="")
        frame2.n.pack()
        frame2.n.configure(text=self.shared_data['assessment'].get())

class StartPage(tk.Frame): #creating start page
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        label = tk.Label(self, text="StudyFriendO", font = LARGE_FONT, bg="#f2fcff")
        label.pack(fill="x")
        #place(x=315,y=100)

        photo1 = tk.PhotoImage(file='apple.png') #photo1 is a variable
        #label (window, image=photo1, bg="black") .grid(row=0, column=0, sticky=E)
        panel = tk.Label(self, image = photo1)
        panel.image = photo1
        panel.pack(fill="x")
        #place(x=270,y=150)

        label2 = tk.Label(self, text="Enter today's date and your first name below:", bg="#f2fcff")
        label2.pack(fill="x", ipady=20)
        #place(x=305, y=400)

        cal = Calendar(self, background="#e0f6fc", disabledbackground="white", bordercolor="light blue", headersbackground="light blue", normalbackground="#e0f6fc", foreground="black", normalforeground='black', headersforeground='white', selectmode="day", year=2021, month=8, day=9)
        cal.place(relx=0.5, rely=0.5, anchor='center')
        #(x=300,y=430) #calendar

        #TEXT ENTRY WHERE PERSON INPUTS NAME
####     nameentry = tk.Entry(self, width=20, bg="white") #text input for users name
        nameentry = tk.Entry(self, width=20, bg="white",  #text input for users name
                             textvariable=controller.shared_data['name'])
        nameentry.place(relx=0.5, rely=0.68, anchor='center')
        #(x=365, y=635)


        caldate = ttk.Button(self, text="Submit",
                             command=lambda: controller.set_date(StartPage)) #button to get current date
        caldate.place(relx=0.5, rely=0.63, anchor='center')

        button1 = ttk.Button(self, text="Enter",
                             command=lambda: controller.show_frame(HomePage)) #button to navigate page
        button1.place(relx=0.5, rely=0.73, anchor='center')
        #(x=387,y=660)

        #BUTTON WHICH CALLS FUNCTION WHICH GRABS NAME (CURRENTLY LOCATED IN WEIRD LOCATION)
        namebutton = ttk.Button(self, text="Submit", command=lambda: controller.getname(StartPage))
        namebutton.place(relx=0.5, y=60)
        #self.date_label = tk.Label(self, text="") #label to display date
        #self.date_label.pack(pady=20)

        self.configure(bg='#f2fcff')


class HomePage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        #label = tk.Label(self, text="Home", font = LARGE_FONT)
        #label.pack(pady=10,padx=10)

        #width of x
        frame = tk.Frame(self, bg="#c0e3ed", height=110)
        frame.pack(fill="x")
        #LABEL WHICH DISPLAYS NAME FROM TEXT ENTRY
        #tk.Label(self, text ="Name's Planner", fg="white", bg="#c0e3ed", font = LARGE_FONT).place(relx=0.5, y=50, anchor='center')
        self.name_label = tk.Label(self, text="", font=("Arial Bold", 40), bg="#c0e3ed")
        self.name_label.place(relx=0.55, y=55, anchor='center')

        self.date_label = tk.Label(self, text="", bg="#c0e3ed")
        # keep placing the label at top right corner
        self.date_label.place(relx=1, y=0, anchor='ne')
        #pack(side='top', anchor='ne')

        #height of Y
        tk.Label(self, text="", fg="white", bg="#99cbd8").pack(side="left", fill="y", ipadx=73)

        button1 = tk.Button(self, height=2, width=10, bg="#e0f6fc", text="Home", command=lambda: controller.show_frame(HomePage)) #button to navigate page
        button1.place(x=35, y=145)

        button1 = tk.Button(self, height=2, width=10, bg="#e0f6fc", text="To Do", command=lambda: controller.show_frame(ToDoPage)) #button to navigate page
        button1.place(x=35, y=225)
        #(relx=0.2, rely=0.4, anchor='center')

        button1 = tk.Button(self, height=2, width=10, bg="#e0f6fc", text="Timetable", command=lambda: controller.show_frame(TimetablePage)) #button to navigate page
        button1.place(x=35, y=305)

        photo2 = tk.PhotoImage(file='pear.png') #photo1 is a variable
        #label (window, image=photo1, bg="black") .grid(row=0, column=0, sticky=E)
        panel = tk.Label(self, image = photo2)
        panel.image = photo2
        panel.place(x=35, y=400)


        #your upcoming assesments title
        title = tk.Label(self, text="Your Upcoming Assesments", bg='#f7f6f6', font=LARGE_FONT)
        title.place(x=200, y=150)

        add_button = ttk.Button(self, text="Add", command=lambda: controller.show_frame(AddPage))
        add_button.place(relx=0.8, rely=1, anchor='se')

        save_button = ttk.Button(self, text="Save")
        save_button.place(relx=0.9, rely=1, anchor='se')
    
        clear_button = ttk.Button(self, text="Clear")
        clear_button.place(relx=1, rely=1, anchor='se')

        



        self.configure(bg='#f7f6f6')


class ToDoPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="To Do", font = LARGE_FONT)
        label.pack(pady=10,padx=10)

        button1 = ttk.Button(self, text="Home",
                             command=lambda: controller.show_frame(HomePage)) #button to navigate page
        button1.pack()

        button1 = ttk.Button(self, text="Timetable",
                             command=lambda: controller.show_frame(TimetablePage)) #button to navigate page
        button1.pack()

        button1 = ttk.Button(self, text="To Do",
                             command=lambda: controller.show_frame(ToDoPage)) #button to navigate page
        button1.pack()


class TimetablePage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="Timetable", font = LARGE_FONT)
        label.pack(pady=10,padx=10)

        button1 = ttk.Button(self, text="Home",
                             command=lambda: controller.show_frame(HomePage)) #button to navigate page
        button1.pack()

        button1 = ttk.Button(self, text="Timetable",
                             command=lambda: controller.show_frame(TimetablePage)) #button to navigate page
        button1.pack()

        button1 = ttk.Button(self, text="To Do",
                             command=lambda: controller.show_frame(ToDoPage)) #button to navigate page
        button1.pack()

class AddPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

                #width of x
        frame = tk.Frame(self, bg="#c0e3ed", height=110)
        frame.pack(fill="x")
        
        label = tk.Label(self, text="Add Assesment", font = LARGE_FONT, bg="#c0e3ed")
        label.place(relx=0.5, y=50, anchor='center')

        button1 = ttk.Button(self, text="Home",
                             command=lambda: controller.show_frame(HomePage)) #button to navigate page
        button1.pack()

        assessment_label = tk.Label(self, text="Enter assesment name:")
        assessment_label.place(relx=0.5, y=200, anchor='center')

        assessment_name = tk.Entry(self, textvariable=controller.shared_data['assessment'])
        assessment_name.place(relx=0.5, y=220, anchor='center')

        enter_button = ttk.Button(self, text="Enter")
        enter_button.place(relx=0.5, y=250, anchor='center')

        cal = Calendar(self, background="#e0f6fc", disabledbackground="white", bordercolor="light blue", headersbackground="light blue", normalbackground="#e0f6fc", foreground="black", normalforeground='black', headersforeground='white', selectmode="day", year=2021, month=8, day=9)
        cal.place(relx=0.5, y=400, anchor='center')

        due_date = ttk.Button(self, text="Submit")
        due_date.place(relx=0.5, y=510, anchor='center')


        add_button = ttk.Button(self, text="Add Assesment", command=lambda: controller.display(HomePage))
        add_button.place(relx=0.5, y=560, anchor='center')




app = StudyFriendO()
app.mainloop()
 

Комментарии:

1. display() это метод вашего главного окна, поэтому, когда вы это делаете tk.Label(self, ...) , вы явно создаете Метку как дочернюю по отношению к этому окну, а не к какой-либо из ваших страниц. Вам нужно передать страницу в качестве первого параметра, а не self .

2. «У кого — нибудь есть какие-либо решения о том, как отображать ярлык только на главной странице?» — да, сделайте его дочерним по отношению к главной странице. У вас в коде много меток, не могли бы вы уточнить, о какой метке вы говорите?

3. Это метка, созданная в display функции. frame2.n = tk.Label(HomePage, text="") frame2.n.pack() . который я только что назвал n.

4. Я заменил HomePage на frame2 , и это сработало, спасибо.