Проблемы с кодом, изо всех сил пытаясь понять, где я иду не так - PullRequest
0 голосов
/ 14 октября 2019
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 голосов
/ 14 октября 2019
  1. Вам нужен только один экземпляр Tk(), за которым следует один экземпляр mainloop(). У вас есть 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...