Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 代码问题,难以理解i';我做错了_Python_Python 3.x_Tkinter - Fatal编程技术网

Python 代码问题,难以理解i';我做错了

Python 代码问题,难以理解i';我做错了,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我正在努力理解如何将两个功能结合起来,即登录屏幕和实际注册帖子的结合 我只是想让代码在一个基本的层次上工作,但我正在努力解决缩进和任何有助于将代码绑定在一起的问题 您曾经只需要一个Tk()实例,然后是一个mainloop()实例。您无缘无故地在多个部分中使用mainloop 您正在调用构建根窗口的函数两次。这真的应该只在底部调用一次 您尝试使用global来获取根窗口,但是生成根窗口的函数没有在全局名称空间中声明它,因此这不会做任何有用的事情 你有很多多余的评论。您不需要对代码中显而易见的#创建

我正在努力理解如何将两个功能结合起来,即登录屏幕和实际注册帖子的结合

我只是想让代码在一个基本的层次上工作,但我正在努力解决缩进和任何有助于将代码绑定在一起的问题

  • 您曾经只需要一个
    Tk()
    实例,然后是一个
    mainloop()
    实例。您无缘无故地在多个部分中使用mainloop

  • 您正在调用构建根窗口的函数两次。这真的应该只在底部调用一次

  • 您尝试使用global来获取根窗口,但是生成根窗口的函数没有在全局名称空间中声明它,因此这不会做任何有用的事情

  • 你有很多多余的评论。您不需要对代码中显而易见的
    #创建登录按钮
    进行注释。如有必要,应保留评论以供澄清。在一些复杂的代码中,读取时不明显。您的代码本身就足够了,即使不需要所有注释,也不需要大部分注释

  • 您创建变量的行
    username=StringVar()。因为您没有告诉它们属于这样的顶级窗口
    username=StringVar(register\u screen)
    默认情况下,这些变量将属于tk的主实例,也就是您的根窗口。这可能会导致问题,最近我遇到的问题是线程问题。因此,请确保始终声明该变量的所有者

  • 在这种情况下,您不需要指定标签、按钮或条目,除非您计划在以后更改或更新它们。在这种情况下,输入字段可以的原因是变量赋值。我们可以直接从中获取值

  • 不需要添加间隔标签。IE
    标签(text=”“).pack()
    。您可以在pack语句中添加填充,也可以使用
    grid()
    以及填充,这是我处理小部件的首选方法

  • 最后,您应该将tkinter作为tk导入
    ,而不是导入
    *
    。这将防止任何方法的覆盖,并明确您从何处获取小部件/方法

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

    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
    

    到底是什么引发了错误?按钮(text=“Register”,height=“2”,width=“30”,command=Register)。pack()^IndentationError:意外的缩进过程结束,退出代码为1comment导致IDE删除缩进-将注释缩进回,您会很好。这会反过来引发另一个错误,即您在使用后将
    main\u screen
    声明为
    global
    ,这是不允许的。此外,当我全局声明main\u screen时,它会说-SyntaxError:name'main\u screen'在全局声明之前使用,所以我不需要全局声明它吗?非常感谢您的帮助,它帮助了我更多的理解,感谢代码的简化,这太棒了。非常感谢你
    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()