2016-09-20 1 views
0

私はpythonとtkinterを試してみるためのアプリケーションを作成しています。私が抱えている問題は、エントリーとラベルを欲しいものに合わせることができないということです。ここでPythonの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と呼び出すと捨てられます。フレーム内でどちらか一方を使用する必要があり、両方を使用する必要はありません。

プロのヒント:レイアウトコードをウィジェットの作成とインタレースするのではなく一緒にグループ化すると、レイアウトが簡単になります。レイアウトコードをブロックにまとめることで、ウィジェットの関係を見るのがはるかに簡単になります。

次の例では、エントリウィジェットとそのラベルのために、2行2列を取得する方法を示しています。

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

関連する問題