我正在创建一个尝试学习python和tkinter的应用程序。我遇到的问题是我似乎无法按照我的要求对齐条目和标签。我想像这样安排他们:
labelUsername entryUsername
labelPassword entryPassword
但是,它目前是这样的:
labelUsername
entryUsername
labelPassword
entryPassword
这是我的代码:
import tkinter as tk
from tkinter import ttk
TITLE_FONT = ("Verdana", 12)
NORMAL_FONT = ("Verdana", 8)
class CCTV(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack()
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (LoginPage, PageOne):
frame = F(container, self)
self.frames[F] = frame
frame.grid(column=0, row=0, sticky="nsew")
self.show_frame(LoginPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class LoginPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = ttk.Label(self, text="Login Page", font=TITLE_FONT)
label.pack(padx=20, pady=20)
labelUsername = ttk.Label(self, text="Username", font=NORMAL_FONT)
labelUsername.grid(row=0, sticky="w")
labelUsername.pack()
entryUsername = ttk.Entry(self, font=NORMAL_FONT)
entryUsername.grid(column=1, row=0)
entryUsername.pack()
labelPassword = ttk.Label(self, text="Password", font=NORMAL_FONT)
labelPassword.grid(row=1, sticky="w")
labelPassword.pack()
entryPassword = ttk.Entry(self, show = "*", font=NORMAL_FONT)
entryPassword.grid(column=1, row=1)
entryPassword.pack()
loginButton = ttk.Button(self, text="Login", command=lambda: controller.show_frame(PageOne))
loginButton.grid()
loginButton.pack()
class PageOne(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Page One", font=TITLE_FONT)
label.pack(padx=20, pady=20)
button1 = tk.Button(self, text="Back to home", command=lambda: controller.show_frame(LoginPage))
button1.pack()
app = CCTV()
app.geometry("800x600")
app.mainloop()
如果您想知道为什么我有这么简单的程序的代码,那么我可以更改正在查看的帧,这样我就可以拥有多个帧而无需创建新的窗口。 任何帮助都将受到高度赞赏。
答案 0 :(得分:1)
如果要在网格中放置小部件,请使用grid
。您使用的是grid
,但是通过调用grid
,您将失去pack
的效果。您必须在框架内使用其中一个,而不是两个。
专业提示:将布局代码组合在一起时,布局更容易,而不是通过创建窗口小部件进行隔行扫描。通过将布局代码放在一个块中,可以更容易地看到窗口小部件的关系。
以下示例显示了如何为条目小部件及其标签获取两行和两列:
class LoginPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = ttk.Label(self, text="Login Page", font=TITLE_FONT)
labelUsername = ttk.Label(self, text="Username", font=NORMAL_FONT)
entryUsername = ttk.Entry(self, font=NORMAL_FONT)
labelPassword = ttk.Label(self, text="Password", font=NORMAL_FONT)
entryPassword = ttk.Entry(self, show = "*", font=NORMAL_FONT)
loginButton = ttk.Button(self, text="Login", command=lambda: controller.show_frame(PageOne))
label.grid(row=0, columnspan=2, pady=10)
labelUsername.grid(row=1, column=0, sticky="w")
entryUsername.grid(row=1, column=1)
labelPassword.grid(row=2, column=0, sticky="w")
entryPassword.grid(row=2, column=1)
loginButton.grid()