2016-09-20 58 views
0

我正在創建一個應用程序來嘗試和學習python和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

如果您想在網格中放置小部件,請使用grid。您正在使用grid,但您通過撥打pack即可拋棄grid的影響。您必須在一個框架內使用一個或另一個,而不是兩個。

專業提示:當您將佈局代碼組合在一起時,佈局更容易,而不是使用窗口小部件創建來交織布局。通過將佈局代碼放在一個塊中,可以更輕鬆地看到小部件的關係。

下面的例子演示瞭如何獲得兩行兩列的錄入組件及其標籤:

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

哇,太感謝你了。這一直在困擾我幾個小時,我不敢相信我甚至沒有考慮過在使用網格和包裝的同時成爲問題。讓我覺得自己像個白癡哈哈。非常感謝,再次感謝! – Conor