【问题标题】:Sticking a label in top right corner of Tkinter application在 Tkinter 应用程序的右上角粘贴标签
【发布时间】:2021-09-30 13:01:33
【问题描述】:

我正在创建一个具有多个页面的 Tkinter 规划器应用程序。在开始页面,您可以在日历中输入日期,然后按“进入”按钮进入应用程序。

然后主页会在右上角显示日期。有没有办法让日期标签与蓝色横幅重叠,这样顶部就没有灰线?还需要放置日期,以便即使在调整窗口大小时它也保持在同一个位置,因此我使用了 pack 功能。但是,我认为pack功能不能与其他标签重叠。

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")

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)

        self.frames = {}

        for F in (StartPage, HomePage, ToDoPage, TimetablePage): #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




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=image file) #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

        nameentry = tk.Entry(self, width=20, bg="white") #text input for users 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)

        #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)
        self.date_label = tk.Label(self, text="") #label to display date
        self.date_label.pack(side='top', anchor='ne')

        #width of x
        tk.Label(self, text ="Name's Planner", fg="white", bg="#c0e3ed", font = LARGE_FONT).pack(fill="x", ipady=30)



        #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(image file) #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)

        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()

app = StudyFriendO()
app.mainloop()

【问题讨论】:

  • 您好,请提供一个可重现的最小示例 (stackoverflow.com/help/minimal-reproducible-example)。
  • 但是我可以说,正如您所说,pack 函数不能与其他标签重叠,因此有两种可能的解决方案:1 - 在调整窗口大小或 2 时使用绑定方法使用 place 和 update de position - 您可以将蓝色横幅制作为框架,而不是带有两个标签的标签:一个用于日期(最初为空白),另一个用于标题。设置日期后,您只需更改日期标签文本

标签: python tkinter


【解决方案1】:

您可以使用.place() 代替.pack(),但最好创建并放置在横幅之后:

...
        tk.Label(self, text ="Name's Planner", fg="white", bg="#c0e3ed", font = LARGE_FONT).pack(fill="x", ipady=30)

        #label to display date with same background color of the above banner
        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')
...

【讨论】:

    猜你喜欢
    • 2023-02-06
    • 2017-09-29
    • 2016-03-13
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    相关资源
    最近更新 更多