Форма регистрации на Python с использованием Tkinter + Страница входа в Python Tkinter с базой данных SQLite3

В этом полном руководстве по python объясняется, как создать регистрационную форму с помощью Python Tkinter и страницу входа в python Tkinter с базой данных sqlite3 . Кроме того, я объяснил, как проверять поля формы в регистрационной форме в Python Tkinter. Надеюсь, вам понравится эта форма регистрации на Python на примере Tkinter .

Все данные будут храниться и извлекаться с использованием базы данных SQLite3 . Это полный проект формы регистрации на Python с базой данных , которую можно использовать для добавления экранов регистрации и входа в любое настольное приложение на Python.

Форма входа и регистрации в Python с использованием обзора Tkinter

  • Формы входа и регистрации создаются с использованием библиотеки Python « Tkinter ». [Подробнее о Python Tkinter ]
  • Tkinter позволяет создавать приложения с графическим интерфейсом и содержит множество полезных виджетов.
  • Для базы данных мы использовали SQLite3 , который поставляется с предустановленным Python. Это облегченная версия SQL, которая может хранить 281 терабайт данных.
  • Мы добавили проверку всех полей ввода в проекте, что означает обязательность предоставления всей информации. Если этого не сделать, появится сообщение об ошибке.
  • Обработчики исключений используются, чтобы избежать поломки программы, также вы увидите ошибку в окне сообщения.
  • Названия всех стран континента « Северная Америка » отображаются в раскрывающемся списке. Если вы хотите добавить больше стран, просто замените country.txt своим текстовым файлом, но обязательно измените имя в коде в строке 129

Текст в файле country

Antigua and Barbuda
Bahamas
Barbados
Belize
Canada
Costa Rica
Cuba
Dominica
Dominican Republic
El Salvador
Grenada
Guatemala
Haiti
Honduras
Jamaica
Mexico
Nicaragua
Panama
Saint Kitts and Nevis
Saint Lucia
Saint Vincent and the Grenadines
Trinidad and Tobago
United States
  • Более простой способ — отредактировать данные внутри country.txt .
  • Вот описание виджетов, используемых в программе. Кроме того, у нас есть специальный раздел для каждого виджета, используемого в проекте, и мы добавили ссылку перед каждым.
Название виджетаОбзор виджета
Рамка Python TkinterМы использовали два фрейма с именами левый фрейм и правый фрейм . они позиционируют страницу входа и регистрации. Менеджер геометрии, используемый для позиционирования фреймов, называется Place.
Ткинтер ЛейблВиджет Label используется для отображения текста на экране приложения. Весь текст на экране, такой как «Введите адрес электронной почты», «Введите имя» и т. д., добавляется с помощью виджета «Ярлык».
Виджеты вводаПоля ввода предоставляют пользователю пустое пространство, и пользователь может вводить данные внутри него. Это один из самых важных виджетов, используемых в любом приложении.
Радиокнопка Python TkinterВиджет Radiobutton используется для предоставления пользователям единственного выбора. В приложении. пользователь может выбрать только один пол за раз.
OptionMenuOptionMenu используется для отображения раскрывающегося списка. Используется для отображения списка стран в приложении. Узнайте больше о OptionMenu.
КнопкаКнопки используются для выполнения действия при нажатии. В этом приложении мы использовали две кнопки с именами «Вход» и «Регистрация».

Регистрационная форма Python Tkinter

В этом разделе мы поговорим о форме регистрации на питоне с помощью tkinter. На этом этапе мы обсудим виджеты и цель их использования. Приведенный здесь код предназначен только для интерфейса страницы регистрации. Полный код приложения находится внизу страницы.

Виджет кадра

  • ws — главное окно, на которое мы собираемся поместить рамку.
  • bd — граница кадра
  • bg — цвет фона.
  • relief должен обеспечить особый эффект.
  • Здесь используется метод геометрии « pack» , но в полном коде ниже мы использовали место , поскольку место позволяет нам позиционировать виджет с более высокой точностью.
  • Идея создания этого виджета заключается в том, чтобы разместить внутри него другие виджеты, чтобы все выглядело организованно.
right_frame = Frame(
    ws, 
    bd=2, 
    bg='#CCCCCC',
    relief=SOLID, 
    padx=10, 
    pady=10
    )

right_frame.pack()

Виджет ярлыка

  • Метка используется для добавления текста в приложение. Мы использовали Label несколько раз для отображения другого текста.
  • Здесь я объясню это один раз, и это будет применимо ко всем меткам, используемым в программе.
  • в приведенном ниже коде Label — это ключевое слово, используемое для создания виджета ярлыка.
  • Мы размещаем эту метку на right_frame .
  • любой текст , добавленный сюда, будет отображаться в приложении
  • Мы используем сетку в качестве геометрического метода для позиционирования текста
Label(
    right_frame, 
    text="Enter Name", 
    bg='#CCCCCC',
    font=f
    ).grid(row=0, column=0, sticky=W, pady=10)

Виджет входа

  • Виджет Entry используется для ввода данных пользователем. Он предоставляет пустое пространство, где пользователь может ввести любой текст.
  • Виджет ввода используется несколько раз в коде, это объяснение реализовано для всех.
  • Ключевое слово Entry используется для всех виджетов ввода вызова и размещается в правой рамке.
  • Мы используем сетку в качестве геометрического метода для позиционирования текста.
register_name = Entry(
    right_frame, 
    font=f
    )

register_name.grid(row=0, column=1, pady=10, padx=20)

Переключатель

  • Радиокнопка используется для предоставления пользователю нескольких вариантов, но пользователь может выбрать только один вариант .
  • Мы создали еще один фрейм с именем « gend_frame», в котором будут храниться все переключатели.
  • text — это имя, которое мы хотим показать рядом с Radiobutton, например, в данном случае «мужской».
  • bg — цвет фона радиокнопки.
  • переменная означает, что значение изменится, поэтому в этом случае мы установили ее как var , которая является StringVar() . Теперь предоставленное значение должно быть строкой. Если для var установлено значение IntVar(), в этом случае значение должно быть целым числом.
  • value может быть целым числом или строкой, в зависимости от типа используемой переменной. Значение помогает определить, какой переключатель выбран.
  • метод геометрии упаковки используется с разрешением расширяться в доступном пространстве и придерживаться их слева.
  • Когда 3 переключателя размещены с одинаковыми свойствами, все они выглядят одинаково и организованы.
var = StringVar()
var.set('male')

male_rb = Radiobutton(
    gender_frame, 
    text='Male',
    bg='#CCCCCC',
    variable=var,
    value='male',
    font=('Times', 10),
    
)

male_rb.pack(expand=True, side=LEFT)

OptionMenu

  • OptionMenu используется для создания раскрывающегося списка в приложении. Не идеально отображать большие данные, потому что у него нет полосы прокрутки, но он занимает меньше места и отображает соответствующее количество параметров.
  • Мы использовали OptionMenu для отображения списка стран континента Северной Америки.
  • на шаге 1 мы использовали ключевое слово OptionMenu для создания виджета и поместили его внутри right_frame , назначенной переменной является StringVar() , что означает, что будут задействованы разные строковые значения. *страны означают все страны в списке.
  • на шаге 2 у нас есть страны = [] , который является пустым списком, и к нему будут добавлены названия стран. переменная =StringVar() означает, что строка будет продолжать изменяться.
  • на шаге 3 мы читаем названия стран из текстового файла, а затем, используя цикл, мы добавляем каждую страну в список. country.rstrip('\n')он удаляет \n из списка.
  • grid — это метод геометрии, используемый для позиционирования виджета.
# step 2
countries = []
variable = StringVar()

# step 3
world = open('countries.txt', 'r')
for country in world:
    country = country.rstrip('\n')
    countries.append(country)
variable.set(countries[22])

# step 1
register_country = OptionMenu(
    right_frame, 
    variable, 
    *countries)

# step 4
register_country.grid(row=4, column=1, pady=10, padx=20)

Кнопка

  • Кнопка в Python Tkinter используется для запуска активности Что-то должно произойти при нажатии.
  • В этом приложении кнопка используется для сохранения данных внутри базы данных.
  • Ключевое слово Button используется для создания виджета и помещается внутри right_frame.
  • ширина – это правое и левое пространство кнопки
  • text — это имя, отображаемое на кнопке.
  • курсор  это значок указателя мыши. Мы использовали hand2 , что означает, что каждый раз, когда пользователь наводит курсор на кнопку, курсор превращается в указательный палец.
  • Команда содержит информацию о том, что произойдет, если кнопка будет нажата. Здесь мы установили его в None, что означает, что ничего не произойдет, но в полном коде мы предоставили ему имя функции.
register_btn = Button(
    right_frame, 
    width=15, 
    text='Register', 
    font=f, 
    relief=SOLID,
    cursor='hand2',
    command=None
)

Форма регистрации с использованием кода tkinter

Вот полный фрагмент кода для регистрационной формы на python с использованием tkinter . Эта программа не зависит от полного кода только с точки зрения пользовательского интерфейса.

from tkinter import *


ws = Tk()
ws.title('PythonGuides')
ws.config(bg='#0B5A81')

f = ('Times', 14)
var = StringVar()
var.set('male')


countries = []
variable = StringVar()
world = open('countries.txt', 'r')
for country in world:
    country = country.rstrip('\n')
    countries.append(country)
variable.set(countries[22])



right_frame = Frame(
    ws, 
    bd=2, 
    bg='#CCCCCC',
    relief=SOLID, 
    padx=10, 
    pady=10
    )


Label(
    right_frame, 
    text="Enter Name", 
    bg='#CCCCCC',
    font=f
    ).grid(row=0, column=0, sticky=W, pady=10)

Label(
    right_frame, 
    text="Enter Email", 
    bg='#CCCCCC',
    font=f
    ).grid(row=1, column=0, sticky=W, pady=10)

Label(
    right_frame, 
    text="Contact Number", 
    bg='#CCCCCC',
    font=f
    ).grid(row=2, column=0, sticky=W, pady=10)

Label(
    right_frame, 
    text="Select Gender", 
    bg='#CCCCCC',
    font=f
    ).grid(row=3, column=0, sticky=W, pady=10)

Label(
    right_frame, 
    text="Select Country", 
    bg='#CCCCCC',
    font=f
    ).grid(row=4, column=0, sticky=W, pady=10)

Label(
    right_frame, 
    text="Enter Password", 
    bg='#CCCCCC',
    font=f
    ).grid(row=5, column=0, sticky=W, pady=10)

Label(
    right_frame, 
    text="Re-Enter Password", 
    bg='#CCCCCC',
    font=f
    ).grid(row=6, column=0, sticky=W, pady=10)

gender_frame = LabelFrame(
    right_frame,
    bg='#CCCCCC',
    padx=10, 
    pady=10,
    )


register_name = Entry(
    right_frame, 
    font=f
    )

register_email = Entry(
    right_frame, 
    font=f
    )

register_mobile = Entry(
    right_frame, 
    font=f
    )


male_rb = Radiobutton(
    gender_frame, 
    text='Male',
    bg='#CCCCCC',
    variable=var,
    value='male',
    font=('Times', 10),
    
)

female_rb = Radiobutton(
    gender_frame,
    text='Female',
    bg='#CCCCCC',
    variable=var,
    value='female',
    font=('Times', 10),
  
)

others_rb = Radiobutton(
    gender_frame,
    text='Others',
    bg='#CCCCCC',
    variable=var,
    value='others',
    font=('Times', 10)
   
)

register_country = OptionMenu(
    right_frame, 
    variable, 
    *countries)

register_country.config(
    width=15, 
    font=('Times', 12)
)
register_pwd = Entry(
    right_frame, 
    font=f,
    show='*'
)
pwd_again = Entry(
    right_frame, 
    font=f,
    show='*'
)

register_btn = Button(
    right_frame, 
    width=15, 
    text='Register', 
    font=f, 
    relief=SOLID,
    cursor='hand2',
    command=None
)


register_name.grid(row=0, column=1, pady=10, padx=20)
register_email.grid(row=1, column=1, pady=10, padx=20) 
register_mobile.grid(row=2, column=1, pady=10, padx=20)
register_country.grid(row=4, column=1, pady=10, padx=20)
register_pwd.grid(row=5, column=1, pady=10, padx=20)
pwd_again.grid(row=6, column=1, pady=10, padx=20)
register_btn.grid(row=7, column=1, pady=10, padx=20)
right_frame.pack()

gender_frame.grid(row=3, column=1, pady=10, padx=20)
male_rb.pack(expand=True, side=LEFT)
female_rb.pack(expand=True, side=LEFT)
others_rb.pack(expand=True, side=LEFT)


ws.mainloop()

В этом выводе вы можете видеть, что регистрационная форма создана с использованием Python Tkinter. В форме есть поля ввода и выбора, созданные с помощью виджетов Python Tkinter.

Страница входа в Python Tkinter с базой данных

В этом разделе будет показано объяснение кода для страницы входа в Python tkinter с базой данных . Полный код приложения находится в конце страницы. Код, показанный в этом разделе, является полным только с точки зрения пользовательского интерфейса.

Виджет Frame в Python Tkinter

  • Виджет Frame позволяет размещать на нем другие виджеты. Внешний вид приложения организуется, если другие виджеты размещены на фрейме, а также дает контроль над разделами.
  • Здесь left_frame используется для создания раздела входа в приложение.
  • Ключевое слово Frame используется для вызова виджета Frame и размещается в главном окне, т.е. ws .
  • bd — ширина границы виджета фрейма в Python Tkinter.
  • relief имеет разные режимы, мы использовали SOLID, он рисует контур. вокруг рамы.
left_frame = Frame(
    ws, 
    bd=2, 
    bg='#CCCCCC',   
    relief=SOLID, 
    padx=10, 
    pady=10
    )

Виджет ярлыков в Python Tkinter

  • Метка используется для добавления текста в приложение.
  • в приведенном ниже коде Label — это ключевое слово, используемое для создания виджета ярлыка.
  • Мы размещаем эту метку на левом кадре .
  • любой текст , добавленный сюда, будет отображаться в приложении
  • Мы используем сетку в качестве геометрического метода для позиционирования текста.
Label(
    left_frame, 
    text="Enter Email", 
    bg='#CCCCCC',
    font=f).grid(row=0, column=0, sticky=W, pady=10)

Виджет входа в Python Tkinter

  • Виджет Entry используется для ввода данных пользователем. Он предоставляет пустое пространство, где пользователь может ввести любой текст.
  • Ключевое слово Entry используется для всех виджетов ввода вызовов и размещается в левом фрейме.
  • Мы используем сетку в качестве геометрического метода для позиционирования текста.
email_tf = Entry(
    left_frame, 
    font=f
    )

email_tf.grid(row=0, column=1, pady=10, padx=20)

Виджет кнопки в Python Tkinter

  • Кнопка в Python Tkinter используется для запуска активности Что-то должно произойти при нажатии.
  • В этом приложении кнопка используется для сохранения данных внутри базы данных.
  • Ключевое слово Button используется для создания виджета и помещается внутри left_frame .
  • ширина – это правое и левое пространство кнопки
  • text — это имя, отображаемое на кнопке.
  • курсор  это значок указателя мыши. Мы использовали hand2, что означает, что каждый раз, когда пользователь наводит курсор на кнопку, курсор превращается в указательный палец.
  • Команда содержит информацию о том, что произойдет, если кнопка будет нажата. Здесь мы установили его в None, что означает, что ничего не произойдет, но в полном коде мы предоставили ему имя функции.
login_btn = Button(
    left_frame, 
    width=15, 
    text='Login', 
    font=f, 
    relief=SOLID,
    cursor='hand2',
    command=None
    )

login_btn.grid(row=2, column=1, pady=10, padx=20)

Полный фрагмент кода для входа:

Вот полный фрагмент кода для формы входа с использованием Python Tkinter. Эта программа не зависит от полного кода только с точки зрения пользовательского интерфейса.

from tkinter import *

ws = Tk()
ws.title('PythonGuides')
ws.config(bg='#0B5A81')

f = ('Times', 14)

left_frame = Frame(
    ws, 
    bd=2, 
    bg='#CCCCCC',   
    relief=SOLID, 
    padx=10, 
    pady=10
    )

Label(
    left_frame, 
    text="Enter Email", 
    bg='#CCCCCC',
    font=f).grid(row=0, column=0, sticky=W, pady=10)

Label(
    left_frame, 
    text="Enter Password", 
    bg='#CCCCCC',
    font=f
    ).grid(row=1, column=0, pady=10)

email_tf = Entry(
    left_frame, 
    font=f
    )
pwd_tf = Entry(
    left_frame, 
    font=f,
    show='*'
    )
login_btn = Button(
    left_frame, 
    width=15, 
    text='Login', 
    font=f, 
    relief=SOLID,
    cursor='hand2',
    command=None
    )

email_tf.grid(row=0, column=1, pady=10, padx=20)
pwd_tf.grid(row=1, column=1, pady=10, padx=20)
login_btn.grid(row=2, column=1, pady=10, padx=20)
left_frame.pack()


ws.mainloop()

В этом выводе вы можете видеть, что форма входа создается с использованием Python Tkinter.

Вот так выглядит страница входа в Python tkinter с базой данных .

Форма регистрации с использованием проверки tkinter для пустых полей

  • В этом разделе мы увидим код для определения пустых полей в регистрационной форме Python Tkinter , мы увидим, как мы можем сделать это обязательным для пользователя, чтобы он вводил данные в соответствующее текстовое поле или поля выбора, такие как Radiobutton и OptionMenu.
  • Для этого мы использовали простую стратегию. Мы проверяем каждое поле Entry и каждый раз, когда пользователь вводит данные, мы увеличиваем переменную check_counter на 1.
  • У нас есть общее количество полей ввода, теперь мы проверяем check_count с общим количеством полей. Если они равны, приложение продолжит работу и сохранит данные, в противном случае оно выдаст сообщение об ошибке для соответствующего пустого поля.
  • Другая проверка, используемая в приложении, предназначена для паролей. Так как у нас два поля для пароля в форме регистрации.
    • Введите пароль
    • Пароль арендатора
  • Мы сравнили эти две вещи друг с другом. Если оба одинаковы, приложение продолжит работу, в противном случае оно выдаст соответствующее сообщение об ошибке.

Фрагмент кода:

Вот код, используемый для проверки полей ввода в регистрационной форме в Python .

check_counter=0
warn = ""

if register_name.get() == "":
   warn = "Name can't be empty"
else:
    check_counter += 1
check_counter=0
        
if register_email.get() == "":
    warn = "Email can't be empty"
else:
    check_counter += 1

if register_mobile.get() == "":
   warn = "Contact can't be empty"
else:
    check_counter += 1
    
if  var.get() == "":
    warn = "Select Gender"
else:
    check_counter += 1

if variable.get() == "":
   warn = "Select Country"
else:
    check_counter += 1

if register_pwd.get() == "":
    warn = "Password can't be empty"
else:
    check_counter += 1

if pwd_again.get() == "":
    warn = "Re-enter password can't be empty"
else:
    check_counter += 1

В этом выводе пользователь пытается зарегистрироваться, не указывая контактный номер, поэтому он получил сообщение об ошибке с упомянутой ошибкой. То же самое произойдет, если пользователь попытается пропустить любое другое поле.

Фрагмент кода:

Вот фрагмент кода для пароля, который не соответствует проверке.

if register_pwd.get() != pwd_again.get():
        warn = "Passwords didn't match!"
else:
   check_counter += 1

Выход:

Вот вывод, показывающий ошибку, возникающую при несовпадении пароля.

Вот как мы можем реализовать проверку в форме регистрации с помощью tkinter .

Сохраните данные регистрационной формы Python Tkinter в sqlite3

Как мы знаем, это пример регистрационной формы на python с использованием Tkinter с базой данных, в этом приложении мы использовали SQLite3 для хранения данных в базе данных. SQLite3 поставляется с предустановленным python, все, что вам нужно, это import sqlite3. для доступа к данным внутри базы данных вы можете использовать DB Browser .

Создать базу данных с помощью SQLite в Python Tkinter

Эта строка кода создаст базу данных с именем userdata.db . Этот файл будет храниться в том же месте, где хранится основной файл. С помощью Db Browser вы можете просматривать и редактировать данные.

con = sqlite3.connect('userdata.db')

Используйте приведенный ниже код, чтобы создать таблицу для базы данных.

con = sqlite3.connect('userdata.db')
cur = con.cursor()
cur.execute('''CREATE TABLE IF NOT EXISTS record(
                    name text, 
                    email text, 
                    contact number, 
                    gender text, 
                    country text,
                    password text
                )
            ''')
con.commit()

Вставка данных с помощью SQLite в Python Tkinter

  • После того, как мы создали базу данных, важно подключиться к базе данных для вставки данных в базу данных.
  • cur.execute()используется для передачи запроса на вставку. Мы использовали переданный запрос в формате словаря.
  • con.commit()записывает изменения в базу данных.
con = sqlite3.connect('userdata.db')
            cur = con.cursor()
            cur.execute("INSERT INTO record VALUES (:name, :email, :contact, :gender, :country, :password)", {
                            'name': register_name.get(),
                            'email': register_email.get(),
                            'contact': register_mobile.get(),
                            'gender': var.get(),
                            'country': variable.get(),
                            'password': register_pwd.get()

            })
            con.commit()

Вот вывод записи, а это интерфейс программного обеспечения Db Browser.

Полный фрагмент кода:

Вот полный код приложения, созданного с помощью Python Tkinter. Мы объяснили весь код выше по разделам.

from tkinter import *
from tkinter import messagebox
import sqlite3

f = ('Times', 14)

con = sqlite3.connect('userdata.db')
cur = con.cursor()
cur.execute('''CREATE TABLE IF NOT EXISTS record(
                    name text, 
                    email text, 
                    contact number, 
                    gender text, 
                    country text,
                    password text
                )
            ''')
con.commit()

            

ws = Tk()
ws.title('PythonGuides')
ws.geometry('940x500')
ws.config(bg='#0B5A81')


def insert_record():
    check_counter=0
    warn = ""
    if register_name.get() == "":
       warn = "Name can't be empty"
    else:
        check_counter += 1
        
    if register_email.get() == "":
        warn = "Email can't be empty"
    else:
        check_counter += 1

    if register_mobile.get() == "":
       warn = "Contact can't be empty"
    else:
        check_counter += 1
    
    if  var.get() == "":
        warn = "Select Gender"
    else:
        check_counter += 1

    if variable.get() == "":
       warn = "Select Country"
    else:
        check_counter += 1

    if register_pwd.get() == "":
        warn = "Password can't be empty"
    else:
        check_counter += 1

    if pwd_again.get() == "":
        warn = "Re-enter password can't be empty"
    else:
        check_counter += 1

    if register_pwd.get() != pwd_again.get():
        warn = "Passwords didn't match!"
    else:
        check_counter += 1

    if check_counter == 8:        
        try:
            con = sqlite3.connect('userdata.db')
            cur = con.cursor()
            cur.execute("INSERT INTO record VALUES (:name, :email, :contact, :gender, :country, :password)", {
                            'name': register_name.get(),
                            'email': register_email.get(),
                            'contact': register_mobile.get(),
                            'gender': var.get(),
                            'country': variable.get(),
                            'password': register_pwd.get()

            })
            con.commit()
            messagebox.showinfo('confirmation', 'Record Saved')

        except Exception as ep:
            messagebox.showerror('', ep) 
    else:
        messagebox.showerror('Error', warn)

def login_response():
    try:
        con = sqlite3.connect('userdata.db')
        c = con.cursor()
        for row in c.execute("Select * from record"):
            username = row[1]
            pwd = row[5]
        
    except Exception as ep:
        messagebox.showerror('', ep)

    uname = email_tf.get()
    upwd = pwd_tf.get()
    check_counter=0
    if uname == "":
       warn = "Username can't be empty"
    else:
        check_counter += 1
    if upwd == "":
        warn = "Password can't be empty"
    else:
        check_counter += 1
    if check_counter == 2:
        if (uname == username and upwd == pwd):
            messagebox.showinfo('Login Status', 'Logged in Successfully!')
        
        else:
            messagebox.showerror('Login Status', 'invalid username or password')
    else:
        messagebox.showerror('', warn)

    
var = StringVar()
var.set('male')

countries = []
variable = StringVar()
world = open('countries.txt', 'r')
for country in world:
    country = country.rstrip('\n')
    countries.append(country)
variable.set(countries[22])

# widgets
left_frame = Frame(
    ws, 
    bd=2, 
    bg='#CCCCCC',   
    relief=SOLID, 
    padx=10, 
    pady=10
    )

Label(
    left_frame, 
    text="Enter Email", 
    bg='#CCCCCC',
    font=f).grid(row=0, column=0, sticky=W, pady=10)

Label(
    left_frame, 
    text="Enter Password", 
    bg='#CCCCCC',
    font=f
    ).grid(row=1, column=0, pady=10)

email_tf = Entry(
    left_frame, 
    font=f
    )
pwd_tf = Entry(
    left_frame, 
    font=f,
    show='*'
    )
login_btn = Button(
    left_frame, 
    width=15, 
    text='Login', 
    font=f, 
    relief=SOLID,
    cursor='hand2',
    command=login_response
    )

right_frame = Frame(
    ws, 
    bd=2, 
    bg='#CCCCCC',
    relief=SOLID, 
    padx=10, 
    pady=10
    )

Label(
    right_frame, 
    text="Enter Name", 
    bg='#CCCCCC',
    font=f
    ).grid(row=0, column=0, sticky=W, pady=10)

Label(
    right_frame, 
    text="Enter Email", 
    bg='#CCCCCC',
    font=f
    ).grid(row=1, column=0, sticky=W, pady=10)

Label(
    right_frame, 
    text="Contact Number", 
    bg='#CCCCCC',
    font=f
    ).grid(row=2, column=0, sticky=W, pady=10)

Label(
    right_frame, 
    text="Select Gender", 
    bg='#CCCCCC',
    font=f
    ).grid(row=3, column=0, sticky=W, pady=10)

Label(
    right_frame, 
    text="Select Country", 
    bg='#CCCCCC',
    font=f
    ).grid(row=4, column=0, sticky=W, pady=10)

Label(
    right_frame, 
    text="Enter Password", 
    bg='#CCCCCC',
    font=f
    ).grid(row=5, column=0, sticky=W, pady=10)

Label(
    right_frame, 
    text="Re-Enter Password", 
    bg='#CCCCCC',
    font=f
    ).grid(row=6, column=0, sticky=W, pady=10)

gender_frame = LabelFrame(
    right_frame,
    bg='#CCCCCC',
    padx=10, 
    pady=10,
    )


register_name = Entry(
    right_frame, 
    font=f
    )

register_email = Entry(
    right_frame, 
    font=f
    )

register_mobile = Entry(
    right_frame, 
    font=f
    )


male_rb = Radiobutton(
    gender_frame, 
    text='Male',
    bg='#CCCCCC',
    variable=var,
    value='male',
    font=('Times', 10),
    
)

female_rb = Radiobutton(
    gender_frame,
    text='Female',
    bg='#CCCCCC',
    variable=var,
    value='female',
    font=('Times', 10),
  
)

others_rb = Radiobutton(
    gender_frame,
    text='Others',
    bg='#CCCCCC',
    variable=var,
    value='others',
    font=('Times', 10)
   
)

register_country = OptionMenu(
    right_frame, 
    variable, 
    *countries)

register_country.config(
    width=15, 
    font=('Times', 12)
)
register_pwd = Entry(
    right_frame, 
    font=f,
    show='*'
)
pwd_again = Entry(
    right_frame, 
    font=f,
    show='*'
)

register_btn = Button(
    right_frame, 
    width=15, 
    text='Register', 
    font=f, 
    relief=SOLID,
    cursor='hand2',
    command=insert_record
)


# widgets placement
email_tf.grid(row=0, column=1, pady=10, padx=20)
pwd_tf.grid(row=1, column=1, pady=10, padx=20)
login_btn.grid(row=2, column=1, pady=10, padx=20)
left_frame.place(x=50, y=50)

register_name.grid(row=0, column=1, pady=10, padx=20)
register_email.grid(row=1, column=1, pady=10, padx=20) 
register_mobile.grid(row=2, column=1, pady=10, padx=20)
register_country.grid(row=4, column=1, pady=10, padx=20)
register_pwd.grid(row=5, column=1, pady=10, padx=20)
pwd_again.grid(row=6, column=1, pady=10, padx=20)
register_btn.grid(row=7, column=1, pady=10, padx=20)
right_frame.place(x=500, y=50)

gender_frame.grid(row=3, column=1, pady=10, padx=20)
male_rb.pack(expand=True, side=LEFT)
female_rb.pack(expand=True, side=LEFT)
others_rb.pack(expand=True, side=LEFT)

# infinite loop
ws.mainloop()

Вывод:

В этом выводе вы можете увидеть интерфейс основного приложения. У нас есть экран входа в систему слева и экран регистрации справа. Необходимо предоставить всю информацию как на экранах входа, так и на экранах регистрации.

На этом экране пользователь, пытающийся войти в систему, не зарегистрирован, поэтому он видит это сообщение об ошибке. Та же ошибка появится, если зарегистрированный пользователь введет неправильные учетные данные.

Это ошибка проверки, пользователь пытался войти в систему, не заполнив все поля.

Это еще одна ошибка проверки, важно, чтобы пароль и повторно введенные пароли совпадали.

В этом выводе пользователь предоставил всю информацию и пароль, соответствующие столбцу повторного ввода пароля. Пользователь регистрируется в приложении.

В этом выводе вы видите, что уже зарегистрированный пользователь может войти в систему, указав правильные учетные данные.

Ниже вы можете видеть, что форма регистрации в python с использованием данных tkinter была сохранена в базе данных sqlite3.