Python tkinter问题调整

时间:2016-09-20 19:24:33

标签: tkinter

我正在创建一个尝试学习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()

如果您想知道为什么我有这么简单的程序的代码,那么我可以更改正在查看的帧,这样我就可以拥有多个帧而无需创建新的窗口。 任何帮助都将受到高度赞赏。

1 个答案:

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