如何创建具有特定布局的子框架?

时间:2016-09-12 19:24:50

标签: python-3.x tkinter

我的目标是制作一个登录程序,但唯一令我困惑的部分是如何制作帧。我需要3个不同的帧,但我不知道如何制作一个其他的帧,如下所示:

mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

我只能使用该单个主机制作标签和小部件。至于另一个,它超出了我。我需要确切地知道每个框架内部的宽度,甚至在创建框架之后我也不知道如何在网格上放置东西。我会选择整体网格,还是在制作网格后做一些改变。我使用以下布局制作框架。基本上我希望在框架中进行速成课程。即使在我试图将其放入代码之后,我收集的任何信息对我都没有意义。

enter image description here

我的编码部分不是框架部分。

#Import tkinter to make gui
from tkinter import *
from tkinter import ttk
import codecs

def login(*args
          ):
    file = open("rot13.txt", "r")
    lines = file.readlines()
    uname = user.get()
    pword = pw.get()

    for i in lines:
        x = i.split()
        if codecs.encode(uname,'rot13') == x[0] and codecs.encode(pword,'rot13') == x[1]:
            result.set("Successful")
            break;
        else:
            result.set("Access Denied")

root = Tk()
root.title("Login")

#Configures column and row settings and sets padding
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

user = StringVar()
pw = StringVar()
result = StringVar()

user_entry = ttk.Entry(mainframe, width=20, textvariable=user)
user_entry.grid(column=2, row=1, sticky=(W, E))

pw_entry = ttk.Entry(mainframe, width=20, textvariable=pw)
pw_entry.grid(column=2, row=2, sticky=(W, E))

ttk.Label(mainframe, text="Username ").grid(column=1, row=1, sticky=W)
ttk.Label(mainframe, text="Password ").grid(column=1, row=2, sticky=W)
ttk.Label(mainframe, text="").grid(column=1, row=3, sticky=W)
ttk.Label(mainframe, text="Result").grid(column=1, row=4, sticky=W)
ttk.Label(mainframe, text="").grid(column=1, row=5, sticky=W)

ttk.Button(mainframe, text="Login", command=login).grid(column=3, row=6, sticky=W)

#Makes a spot to put in result
ttk.Label(mainframe, textvariable=result).grid(column=2, row=4, sticky=(W, E))
#Opens up with item selected and allows you to enter username without having to click it
user_entry.focus()
#Runs calculate if click enter
root.bind('<Return>', login)
root.mainloop()

1 个答案:

答案 0 :(得分:1)

我认为你缺少的关键点是大型机的子帧使用大型机作为父级,子帧内的小部件使用子帧作为父级。此外,您可以将子帧放置在主机内,并将子帧小部件放置在子帧内。您不必将父项传递给.grid,因为每个小部件都知道它的父级。一个简化的例子:

from tkinter import *
root = Tk()
mainframe = Frame(root)
login = Frame(mainframe)
label = Label(login, text='label')
entry = Entry(login)
display = Frame(mainframe)
result = Label(display, text='display result')

mainframe.grid()  # within root
login.grid(row=0, column=0) # within mainframe
label.grid(row=0, column=0) # within login
entry.grid(row=0, column=1) # within login
display.grid()  # within mainfram
result.grid(row=2, column=0) # within display
相关问题