Tkinter 无法将标签框放在 window 的顶部
Tkinter cannot place Label Frame at the top of a window
我的问题是我的第二个标签框架不会移动到一半,我希望两个框架的顶部相互对齐,这样它们就可以并排放置,但是第二个标签框架在应用程序的一半位置。我已经查看了代码,看不到任何替代它的地方,任何人都可以帮忙吗?我知道这段代码可能不是最有效的,但它目前可以作为更大项目的基石,我希望在我进一步创建程序时改进它,所以任何建议都会很棒。
from tkinter import *
import tkinter.ttk as ttk
import sqlite3
from random import randint
def available():
print("works")
ref = ""
for x in range(0,9):
ref = ref + str(randint(0,9))enter code here
####VARS####
master = Tk()
master.geometry('700x700+500+100')
master.title('Booking System | Ref: ' + ref)
carvar = StringVar(master)
carvar.set("Select Option")
typevar = StringVar(master)
typevar.set("Select Option")
statusvar = StringVar(master)
statusvar.set("Select Option")
############
#booking consts#
blpadx = (0,10)
bepadx = (0,5)
#Column 0
booking = LabelFrame(master, text="Booking Information", padx=5, pady=5)
booking.grid(padx=(20,10), pady=(20,10), column=0, row=0, columnspan=2)
dateFrom = Label(booking, text="Book From:")
dateFrom.grid(column=0, row=0, padx=blpadx, pady=(5,0),sticky=W)
days = Label(booking, text="Days:")
days.grid(column=0, row=1, padx=blpadx, pady=(5,0), sticky=W)
dateTo = Label(booking, text="Book To:")
dateTo.grid(column=0, row=2, padx=blpadx, pady=(5,0), sticky=W)
rooms = Label(booking, text="Rooms:")
rooms.grid(column=0, row=3, padx=blpadx, pady=(5,0), sticky=W)
car = Label(booking, text="Car:")
car.grid(column=0, row=4, padx=blpadx, pady=(5,0), sticky=W)
stayType = Label(booking, text="Stay Type:")
stayType.grid(column=0, row=5, padx=blpadx, pady=(5,0), sticky=W)
bookStatus = Label(booking, text="Booking Status:")
bookStatus.grid(column=0, row=6, padx=blpadx, pady=(5,0), sticky=W)
bHrRule = ttk.Separator(booking, orient=HORIZONTAL)
bHrRule.grid(column=0, row=7, columnspan=2, sticky=EW,pady=(15,15))
availableInfo = Label(booking, text="Click Check Availability to show the room types\n available between the selected dates.")
availableInfo.grid(column=0, row=8, padx=blpadx, pady=(0,10), columnspan=2)
available = Button(booking, text="Check Availability", command=available)
available.grid(column=0, row=9, columnspan=2, pady=(0,15))
#Column 1
dateFromEntry = Entry(booking)
dateFromEntry.grid(column=1, row=0, padx=bepadx, pady=(5,0))
dateFromEntry.insert(END, "DD/MM/YYYY")
daysEntry = Entry(booking)
daysEntry.grid(column=1, row=1, padx=bepadx, pady=(5,0))
dateToEntry = Entry(booking)
dateToEntry.grid(column=1, row=2, padx=bepadx, pady=(5,0))
dateToEntry.insert(END, "DD/MM/YYYY")
roomsEntry = Entry(booking)
roomsEntry.grid(column=1, row=3, padx=bepadx, pady=(5,0))
carEntry = OptionMenu(booking,carvar, "No", "Yes")
carEntry.config(width=15)
carEntry.grid(column=1, row=4, padx=bepadx, pady=(5,0))
stayType = OptionMenu(booking,typevar, "Self Catering", "All-Inclusive")
stayType.config(width=15)
stayType.grid(column=1, row=5, padx=bepadx, pady=(5,0))
bookStatus = OptionMenu(booking,statusvar, "placeholder", "same")
bookStatus.grid(column=1, row=6, padx=bepadx, pady=(5,0))
bookStatus.config(width=15)
#Column 2
customer = LabelFrame(master, text="Customer Details", padx=5, pady=5)
customer.grid(padx=(0,0), pady=(0,0), column=2, row=0)
title = Label(customer, text="Book From:")
title.grid(column=2, row=0, padx=blpadx, pady=(5,0),sticky=W)
#Shoop De Loop
mainloop()
当您添加标签框 customer
时,您只使用了 W
的 sticky
。这意味着它会粘在给定的 space 的左侧,而不是顶部和底部。如果你想让它粘在给定的 space 的顶部,你需要包括 "N"。
这里有一个建议,可以让这些问题更容易被发现,将所有布局代码组合在一起。而不是小部件,布局,小部件,布局,把所有的小部件放在一起,然后把所有的布局放在一起。
我还建议将所有兄弟姐妹放在一起。所以,首先布局labelframes,然后是每个框架中的其他小部件。
例如:
#Column 0
booking = LabelFrame(master, text="Booking Information", padx=5, pady=5)
dateFrom = Label(booking, text="Book From:")
days = Label(booking, text="Days:")
dateTo = Label(booking, text="Book To:")
rooms = Label(booking, text="Rooms:")
car = Label(booking, text="Car:")
stayType = Label(booking, text="Stay Type:")
bookStatus = Label(booking, text="Booking Status:")
bHrRule = ttk.Separator(booking, orient=HORIZONTAL)
availableInfo = Label(booking, text="Click Check Availability to show the room types\n available between the selected dates.")
available = Button(booking, text="Check Availability")
#Column 1
dateFromEntry = Entry(booking)
dateFromEntry.insert(END, "DD/MM/YYYY")
daysEntry = Entry(booking)
dateToEntry = Entry(booking)
dateToEntry.insert(END, "DD/MM/YYYY")
roomsEntry = Entry(booking)
carEntry = OptionMenu(booking,carvar, "No", "Yes")
carEntry.config(width=15)
stayType = OptionMenu(booking,typevar, "Self Catering", "All-Inclusive")
stayType.config(width=15)
bookStatus = OptionMenu(booking,statusvar, "placeholder", "same")
bookStatus.config(width=15)
#Column 2
customer = LabelFrame(master, text="Customer fooDetails", padx=5, pady=5)
title = Label(customer, text="Book From:")
booking.grid(padx=(20,10), pady=(20,10), column=0, row=0, columnspan=2)
customer.grid(padx=(0,0), pady=(0,0), column=2, row=0, sticky="N")
# booking
dateFrom.grid(column=0, row=0, padx=blpadx, pady=(5,0),sticky=W)
dateFromEntry.grid(column=1, row=0, padx=bepadx, pady=(5,0))
dateTo.grid(column=0, row=2, padx=blpadx, pady=(5,0), sticky=W)
days.grid(column=0, row=1, padx=blpadx, pady=(5,0), sticky=W)
rooms.grid(column=0, row=3, padx=blpadx, pady=(5,0), sticky=W)
car.grid(column=0, row=4, padx=blpadx, pady=(5,0), sticky=W)
stayType.grid(column=0, row=5, padx=blpadx, pady=(5,0), sticky=W)
bookStatus.grid(column=0, row=6, padx=blpadx, pady=(5,0), sticky=W)
bHrRule.grid(column=0, row=7, columnspan=2, sticky=EW,pady=(15,15))
availableInfo.grid(column=0, row=8, padx=blpadx, pady=(0,10), columnspan=2)
available.grid(column=0, row=9, columnspan=2, pady=(0,15))
daysEntry.grid(column=1, row=1, padx=bepadx, pady=(5,0))
dateToEntry.grid(column=1, row=2, padx=bepadx, pady=(5,0))
roomsEntry.grid(column=1, row=3, padx=bepadx, pady=(5,0))
carEntry.grid(column=1, row=4, padx=bepadx, pady=(5,0))
stayType.grid(column=1, row=5, padx=bepadx, pady=(5,0))
bookStatus.grid(column=1, row=6, padx=bepadx, pady=(5,0))
# customer
title.grid(column=2, row=0, padx=blpadx, pady=(5,0))
这不一定完全我会怎么做,但重点是逻辑上对您的代码进行分组,这样您就可以只关注布局,或者只关注小部件对象,而不是必须同时处理这一切。
我的问题是我的第二个标签框架不会移动到一半,我希望两个框架的顶部相互对齐,这样它们就可以并排放置,但是第二个标签框架在应用程序的一半位置。我已经查看了代码,看不到任何替代它的地方,任何人都可以帮忙吗?我知道这段代码可能不是最有效的,但它目前可以作为更大项目的基石,我希望在我进一步创建程序时改进它,所以任何建议都会很棒。
from tkinter import *
import tkinter.ttk as ttk
import sqlite3
from random import randint
def available():
print("works")
ref = ""
for x in range(0,9):
ref = ref + str(randint(0,9))enter code here
####VARS####
master = Tk()
master.geometry('700x700+500+100')
master.title('Booking System | Ref: ' + ref)
carvar = StringVar(master)
carvar.set("Select Option")
typevar = StringVar(master)
typevar.set("Select Option")
statusvar = StringVar(master)
statusvar.set("Select Option")
############
#booking consts#
blpadx = (0,10)
bepadx = (0,5)
#Column 0
booking = LabelFrame(master, text="Booking Information", padx=5, pady=5)
booking.grid(padx=(20,10), pady=(20,10), column=0, row=0, columnspan=2)
dateFrom = Label(booking, text="Book From:")
dateFrom.grid(column=0, row=0, padx=blpadx, pady=(5,0),sticky=W)
days = Label(booking, text="Days:")
days.grid(column=0, row=1, padx=blpadx, pady=(5,0), sticky=W)
dateTo = Label(booking, text="Book To:")
dateTo.grid(column=0, row=2, padx=blpadx, pady=(5,0), sticky=W)
rooms = Label(booking, text="Rooms:")
rooms.grid(column=0, row=3, padx=blpadx, pady=(5,0), sticky=W)
car = Label(booking, text="Car:")
car.grid(column=0, row=4, padx=blpadx, pady=(5,0), sticky=W)
stayType = Label(booking, text="Stay Type:")
stayType.grid(column=0, row=5, padx=blpadx, pady=(5,0), sticky=W)
bookStatus = Label(booking, text="Booking Status:")
bookStatus.grid(column=0, row=6, padx=blpadx, pady=(5,0), sticky=W)
bHrRule = ttk.Separator(booking, orient=HORIZONTAL)
bHrRule.grid(column=0, row=7, columnspan=2, sticky=EW,pady=(15,15))
availableInfo = Label(booking, text="Click Check Availability to show the room types\n available between the selected dates.")
availableInfo.grid(column=0, row=8, padx=blpadx, pady=(0,10), columnspan=2)
available = Button(booking, text="Check Availability", command=available)
available.grid(column=0, row=9, columnspan=2, pady=(0,15))
#Column 1
dateFromEntry = Entry(booking)
dateFromEntry.grid(column=1, row=0, padx=bepadx, pady=(5,0))
dateFromEntry.insert(END, "DD/MM/YYYY")
daysEntry = Entry(booking)
daysEntry.grid(column=1, row=1, padx=bepadx, pady=(5,0))
dateToEntry = Entry(booking)
dateToEntry.grid(column=1, row=2, padx=bepadx, pady=(5,0))
dateToEntry.insert(END, "DD/MM/YYYY")
roomsEntry = Entry(booking)
roomsEntry.grid(column=1, row=3, padx=bepadx, pady=(5,0))
carEntry = OptionMenu(booking,carvar, "No", "Yes")
carEntry.config(width=15)
carEntry.grid(column=1, row=4, padx=bepadx, pady=(5,0))
stayType = OptionMenu(booking,typevar, "Self Catering", "All-Inclusive")
stayType.config(width=15)
stayType.grid(column=1, row=5, padx=bepadx, pady=(5,0))
bookStatus = OptionMenu(booking,statusvar, "placeholder", "same")
bookStatus.grid(column=1, row=6, padx=bepadx, pady=(5,0))
bookStatus.config(width=15)
#Column 2
customer = LabelFrame(master, text="Customer Details", padx=5, pady=5)
customer.grid(padx=(0,0), pady=(0,0), column=2, row=0)
title = Label(customer, text="Book From:")
title.grid(column=2, row=0, padx=blpadx, pady=(5,0),sticky=W)
#Shoop De Loop
mainloop()
当您添加标签框 customer
时,您只使用了 W
的 sticky
。这意味着它会粘在给定的 space 的左侧,而不是顶部和底部。如果你想让它粘在给定的 space 的顶部,你需要包括 "N"。
这里有一个建议,可以让这些问题更容易被发现,将所有布局代码组合在一起。而不是小部件,布局,小部件,布局,把所有的小部件放在一起,然后把所有的布局放在一起。
我还建议将所有兄弟姐妹放在一起。所以,首先布局labelframes,然后是每个框架中的其他小部件。
例如:
#Column 0
booking = LabelFrame(master, text="Booking Information", padx=5, pady=5)
dateFrom = Label(booking, text="Book From:")
days = Label(booking, text="Days:")
dateTo = Label(booking, text="Book To:")
rooms = Label(booking, text="Rooms:")
car = Label(booking, text="Car:")
stayType = Label(booking, text="Stay Type:")
bookStatus = Label(booking, text="Booking Status:")
bHrRule = ttk.Separator(booking, orient=HORIZONTAL)
availableInfo = Label(booking, text="Click Check Availability to show the room types\n available between the selected dates.")
available = Button(booking, text="Check Availability")
#Column 1
dateFromEntry = Entry(booking)
dateFromEntry.insert(END, "DD/MM/YYYY")
daysEntry = Entry(booking)
dateToEntry = Entry(booking)
dateToEntry.insert(END, "DD/MM/YYYY")
roomsEntry = Entry(booking)
carEntry = OptionMenu(booking,carvar, "No", "Yes")
carEntry.config(width=15)
stayType = OptionMenu(booking,typevar, "Self Catering", "All-Inclusive")
stayType.config(width=15)
bookStatus = OptionMenu(booking,statusvar, "placeholder", "same")
bookStatus.config(width=15)
#Column 2
customer = LabelFrame(master, text="Customer fooDetails", padx=5, pady=5)
title = Label(customer, text="Book From:")
booking.grid(padx=(20,10), pady=(20,10), column=0, row=0, columnspan=2)
customer.grid(padx=(0,0), pady=(0,0), column=2, row=0, sticky="N")
# booking
dateFrom.grid(column=0, row=0, padx=blpadx, pady=(5,0),sticky=W)
dateFromEntry.grid(column=1, row=0, padx=bepadx, pady=(5,0))
dateTo.grid(column=0, row=2, padx=blpadx, pady=(5,0), sticky=W)
days.grid(column=0, row=1, padx=blpadx, pady=(5,0), sticky=W)
rooms.grid(column=0, row=3, padx=blpadx, pady=(5,0), sticky=W)
car.grid(column=0, row=4, padx=blpadx, pady=(5,0), sticky=W)
stayType.grid(column=0, row=5, padx=blpadx, pady=(5,0), sticky=W)
bookStatus.grid(column=0, row=6, padx=blpadx, pady=(5,0), sticky=W)
bHrRule.grid(column=0, row=7, columnspan=2, sticky=EW,pady=(15,15))
availableInfo.grid(column=0, row=8, padx=blpadx, pady=(0,10), columnspan=2)
available.grid(column=0, row=9, columnspan=2, pady=(0,15))
daysEntry.grid(column=1, row=1, padx=bepadx, pady=(5,0))
dateToEntry.grid(column=1, row=2, padx=bepadx, pady=(5,0))
roomsEntry.grid(column=1, row=3, padx=bepadx, pady=(5,0))
carEntry.grid(column=1, row=4, padx=bepadx, pady=(5,0))
stayType.grid(column=1, row=5, padx=bepadx, pady=(5,0))
bookStatus.grid(column=1, row=6, padx=bepadx, pady=(5,0))
# customer
title.grid(column=2, row=0, padx=blpadx, pady=(5,0))
这不一定完全我会怎么做,但重点是逻辑上对您的代码进行分组,这样您就可以只关注布局,或者只关注小部件对象,而不是必须同时处理这一切。