[英]Tkinter: Create non overlapping frames
我正在使用更改密碼屏幕創建登錄屏幕,但是兩個屏幕相互重疊時遇到了問題。
import fileinput
import tkinter as tk
import tkinter.messagebox as tm
from tkinter import ttk
class TypingLogin(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container=tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (LoginScreen,TestScreen):
frame=F(container, self)
self.frames[F]=frame
self.ShowFrame(LoginScreen)
def ShowFrame(self, cont):
frame=self.frames[cont]
frame.tkraise()
class LoginScreen(tk.Frame):
def __init__(self, parent, controller):
self.controller=controller
self.parent=parent
tk.Frame.__init__(self, parent)
w = 270
h = 170
x = 500
y = 100
controller.geometry("%dx%d+%d+%d" % (w, h, x, y))
self.canvas=tk.Frame(parent, bg="red")
self.canvas.pack(side='top',fill='both',expand='yes')
self.passwordlabel=tk.Label(self.canvas, text="Password")
self.passwordentry=tk.Entry(self.canvas, show="*")
self.passwordlabel.place(x=40, y=60)
self.passwordentry.place(x=100, y=60)
self.loginbutton=tk.Button(self.canvas, text="Change Password", command=self.ChangeButtonClicked)
self.loginbutton2=tk.Button(self.canvas, text="Login")#When Lesson select screen is made, put navigating command here
self.loginbutton.place(x=80, y=120)
self.loginbutton2.place(x=110, y=90)
self.usernamelabel=tk.Label(self.canvas, text="Username")
self.usernameentry=ttk.Combobox(self.canvas)
self.usernameentry.bind("<<ComboboxSelected>>")
self.usernameentry['values']=(combol)
self.usernameentry.current(0)
self.usernamelabel.place(x=35, y=30)
self.usernameentry.place(x=100, y=30)
def ChangeButtonClicked(self):
global username, passWord, codedPassWord
username=self.usernameentry.get()
passWord=self.passwordentry.get()
codedPassWord = CodeWord(passWord)
allUsers = LoadListFromFile()
isFound = False
for name,password in allUsers:
if name == username:
if codedPassWord == password:
isFound = True
if isFound:
self.controller.ShowFrame(TestScreen)
else:
tm.showerror("Login error", "Incorrect Login details")
class TestScreen(tk.Frame,tk.Toplevel):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
w = 270
h = 170
x = 500
y = 100
controller.geometry("%dx%d+%d+%d" % (w, h, x, y))
self.canvas=tk.Frame(parent, bg="blue")
self.canvas.pack(side='top',fill='both',expand='yes')
self.label=tk.Label(self, text="Old Password")
self.label2=tk.Label(self, text="New Password")
self.label3=tk.Label(self, text="Confirm Password")
self.entry=tk.Entry(self, show="*")
self.entry2=tk.Entry(self, show="*")
self.entry3=tk.Entry(self, show="*")
self.label.place(x=40, y=25)
self.label2.place(x=40, y=50)
self.label3.place(x=40, y=75)
self.entry.place(x=100, y=25)
self.entry2.place(x=100, y=50)
self.entry3.place(x=100, y=75)
self.changebutton=tk.Button(self, text="Change")
self.changebutton.place(x=70, y=100)
combol=['Select your name']
for e,f in my:
combol.append(e)
app = TypingLogin()
app.title("CLHS Typing Program")
app.mainloop()
我感覺好像缺少了一些簡單的東西。 我已經為此工作了很長時間,以至於我可能會在問題所在的地方瀏覽。 一雙新鮮的眼睛在這里真的很有幫助。
編輯:按鈕“登錄”和“更改密碼”在那里,它們就位於重疊的屏幕/框架下方。 只需向上或向下擴展窗口即可發現它們。
第一個問題是您將畫布放在錯誤的窗口中。 屏幕中的所有內容都必須是該屏幕的子代或后代的子代。
您需要更改此:
self.canvas = tk.Frame(parent, ...)
對此:
self.canvas = tk.Frame(self, ...)
然后,您需要確保將所有屏幕都放置在主窗口中。 通過在創建屏幕的循環內調用grid
執行此操作:
for F in (LoginScreen,TestScreen):
...
frame.grid(row=0, column=0, sticky="nsew")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.