#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
, и это сработало, спасибо.