代码问题,努力了解我要去哪里哪里

时间:2019-10-14 12:12:24

标签: python python-3.x tkinter

from tkinter import *

def main_account_screen():

    main_screen = Tk()  # create a GUI window
    main_screen.geometry("700x450")  # set the configuration of GUI window
    main_screen.wm_iconbitmap('py.ico')
    main_screen.title("Account Login")  # set the title of GUI window

    # create a Form label
    Label(text="Login or Register", bg="red", width="300", height="2", font=("Arial Black", 13,)).pack()
    Label(text="").pack()

    # create Login Button
    Button(text="Login", height="4", width="30", font=("Arial Black", 13,)).pack()
    Label(text="").pack()

    # create a register button
    Button(text="Register", height="4", width="30", font=("Arial Black", 13,)).pack()

    main_screen.mainloop()  # start the GUI

main_account_screen()  # call the main_account_screen() function


def register():
        # The Toplevel widget work pretty much like Frame,
        # but it is displayed in a separate, top-level window.
        # Such windows usually have title bars, borders, and other “window decorations”.
        # And in argument we have to pass global screen variable

    register_screen = Toplevel(main_screen)
    register_screen.title("Register")
    register_screen.geometry("300x250")

    # Set text variables
    username = StringVar()
    password = StringVar()

    # Set label for user's instruction
    Label(register_screen, text="Please enter details below", bg="blue").pack()
    Label(register_screen, text="").pack()

    # Set username label
    username_lable = Label(register_screen, text="Username * ")
    username_lable.pack()

    # Set username entry
    # The Entry widget is a standard Tkinter widget used to enter or display a single line of text.

    username_entry = Entry(register_screen, textvariable=username)
    username_entry.pack()

    # Set password label
    password_lable = Label(register_screen, text="Password * ")
    password_lable.pack()

    # Set password entry
    password_entry = Entry(register_screen, textvariable=password, show='*')
    password_entry.pack()

    Label(register_screen, text="").pack()

    # Set register button
    Button(register_screen, text="Register", width=10, height=1, bg="blue").pack()

    global main_screen

# add command=register in button widget

    Button(text="Register", height="2", width="30", command=register).pack()

    main_screen.mainloop()  # start the GUI

main_account_screen()  # call the main_account_screen() function

我对将两个功能(即登录屏幕和实际注册信息的组合)结合起来的理解感到困惑。

只是试图使代码在基本水平上工作,但是我在缩进和任何有助于将代码绑定在一起的事情上都在挣扎。

1 个答案:

答案 0 :(得分:0)

  1. 您只需要一个Tk()实例,然后需要一个mainloop()实例。您无缘无故地在多个部分中拥有主循环。

  2. 您正在调用两次构建根窗口的函数。而且实际上应该只在底部调用一次。

  3. 您尝试使用global获取根窗口,但是构成根窗口的函数未在全局名称空间中声明它,因此不会做任何有用的事情。

  4. 您有很多多余的评论。您无需注释# create Login Button,这从代码中显而易见。应该保留评论以在需要的地方进行澄清。在阅读时不太明显的一些复杂代码中。您的代码本身就足够了,因为即使不是全部,也不需要大部分注释。

  5. 创建变量username = StringVar()的行不会完全按照您的想法进行。因为您没有像这样username = StringVar(register_screen)那样告诉它们属于顶层窗口,所以这些变量实际上默认属于tk的主实例,也就是您的根窗口。这可能会导致问题,最近我上次遇到此问题是由于线程。因此,请确保始终声明拥有该变量的内容。

  6. 在这种情况下,您无需分配标签,按钮或条目,除非您计划对其进行更改或沿途进行更新。在这种情况下,输入字段可以使用的原因是由于变量分配。我们可以直接从中获取价值。

  7. 您不需要添加间隔标签。 IE Label(text="").pack()。您可以将padding添加到pack语句中,也可以将grid()与padding一起使用,这是我处理小部件的首选方法。

最后,您应该执行import tkinter as tk而不是导入*。这样可以防止方法的任何覆盖,并清楚说明从何处获取窗口小部件/方法。

这是您的代码简化了。如果您有任何疑问,请告诉我。我已将您的75行代码减少到25行。

import tkinter as tk


def register():
    top = tk.Toplevel(root)
    top.title("Register")
    top.geometry("300x250")
    username = tk.StringVar(top)
    password = tk.StringVar(top)
    tk.Label(top, text="Please enter details below", bg="blue").pack()
    tk.Label(top, text="Username * ").pack()
    tk.Entry(top, textvariable=username).pack(padx=10, pady=10)
    tk.Label(top, text="Password * ").pack()
    tk.Entry(top, textvariable=password, show='*').pack(padx=10, pady=10)
    tk.Button(top, text="Register", width=10, height=1, bg="blue").pack()


root = tk.Tk()
root.geometry("700x450")
root.title("Account Login")
tk.Label(root, text="Login or Register", bg="red", width="300", height="2", font=("Arial Black", 13,)).pack()
tk.Button(root, text="Login", height="4", width="30", font=("Arial Black", 13,)).pack(padx=15, pady=15)
tk.Button(root, text="Register", height="4", width="30", font=("Arial Black", 13,), command=register).pack()

root.mainloop()