2016-09-20 4 views
0

나는 파이썬과 tkinter를 배우고 배우기 위해 응용 프로그램을 만들고 있습니다. 내가 가지고있는 문제는 항목과 레이블을 원하는대로 정렬 할 수 없다는 것입니다. 나는 이런 식으로 배열하고 싶습니다 :파이썬 tkinter 정렬 문제

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

을 궁금해하는 경우 : 여기

labelUsername 
entryUsername 
labelPassword 
entryPassword 

내 코드입니다 이러한 간단한 프로그램을위한 코드가 많기 때문에 새로운 윈도우를 만들지 않고 여러 프레임을 가질 수 있도록 프레임을 변경할 수 있습니다. 도움을 주시면 감사하겠습니다.

답변

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

와우는, 정말 감사합니다. 이것은 몇 시간 동안 저를 괴롭 혔고 그리드와 팩을 동시에 사용하는 것에 대해 생각조차하지 못했다고는 믿을 수 없습니다. 나를 바보처럼 느껴지게 하하. 고맙게 생각하고 다시 한 번 감사드립니다! – Conor