🐍 Python, Tkinter ΠΈ SQL: Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для создания словарСй ΠΈ запоминания иностранных слов

Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ Tkinter ΠΈ основныС SQL-ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² Ρ…ΠΎΠ΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ WordMatch с графичСским интСрфСйсом ΠΈ CRUD-ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ создания ΠΈ рСдактирования ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… словарСй.

ΠžΠ±Π·ΠΎΡ€ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ WordMatch Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Ρ‚Ρ€ΠΈ модуля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈ вмСстС, ΠΈ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ:

  1. Π‘ΠΊΡ€ΠΈΠΏΡ‚ для создания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ словаря.
  2. GUI интСрфСйс ΠΈ Π½Π°Π±ΠΎΡ€ CRUD ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ для добавлСния, рСдактирования ΠΈ удалСния записСй Π² словарС.
  3. GUI интСрфСйс ΠΈ скрипт для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ сопоставлСния иностранных слов ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π² случайном порядкС.
WordMatch состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… нСзависимых скриптов

Π§Ρ‚ΠΎ ΠΌΡ‹ ΠΈΠ·ΡƒΡ‡ΠΈΠΌ

  1. Как ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ CRUD ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ запросы Π½Π° языкС SQL.
  2. Как ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ события Π² элСмСнтах Listbox.
  3. Как Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ дСйствия основным ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ΅ закрытия ΠΎΠΊΠ½Π°.

Π‘ΠΊΡ€ΠΈΠΏΡ‚ для создания словаря

Π‘Π»ΠΎΠ²Π°Ρ€ΡŒ прСдставляСт собой Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… SQLite, которая поставляСтся с Python ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Для создания Π½ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ‹ Π½Π΅ придСтся ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ. Однако ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… инструмСнтов для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с SQLite ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ²-Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ²:

  1. SQLiteStudio
  2. DBeaver
  3. DB Browser for SQLite

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ словаря dictionary задаСтся Π² sql_create_dictionary_table скрипта create_new_db.py:

  • id – порядковый Π½ΠΎΠΌΠ΅Ρ€ записи (Ρ†Π΅Π»ΠΎΠ΅ число);
  • word – иностранноС слово (тСкстовоС ΠΏΠΎΠ»Π΅);
  • meaning – Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ слова Π½Π° русском языкС (тСкстовоС ΠΏΠΎΠ»Π΅).

ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π² этом описании ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅ для фонСтичСской транскрипции. Для создания Π±Π°Π·Ρ‹ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π½Π°Π΄ΠΎ сначала ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅ ΡƒΠΆΠ΅ имССтся Π½Π° дискС. Если Π½ΡƒΠΆΠ½ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Π½Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π·Π°Ρ€Π°Π½Π΅Π΅, Π½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΊ Π½Π΅ΠΉ Π² ΠΊΠΎΠ΄Π΅, Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ скрипта Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Ρ‚Π°ΠΊ:

unable to open database file
Ошибка: Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ Π±Π°Π·Π΅.

Если ΠΆΠ΅ ΠΏΡƒΡ‚ΡŒ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, Ρ„Π°ΠΉΠ» Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ создан Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ – Π² Windows это C:\Users\User.

ΠŸΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΊ Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π±Π°Π·Π΅ SQLite создаСт Ρ„Π°ΠΉΠ» Π±Π°Π·Ρ‹ автоматичСски, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ сущСствуСт. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ скрипта для создания Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… словаря. ΠŸΡ€ΠΈ этом ΠΏΠ°ΠΏΠΊΠ° Dictionary Π² ΠΏΠΎΠ΄Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Users Π±Ρ‹Π»Π° создана Π·Π°Ρ€Π°Π½Π΅Π΅, Π° Ρ„Π°ΠΉΠ» dictionary.db Π² Π½Π΅ΠΉ Π±Ρ‹Π» сгСнСрирован скриптом автоматичСски:

create_new_db.py
import sqlite3
from sqlite3 import Error

def create_connection(db_file):
    conn = None
    try:
        conn = sqlite3.connect(db_file)
        return conn
    except Error as e:
        print(e)

    return conn

def create_table(conn, create_table_sql):
    try:
        c = conn.cursor()
        c.execute(create_table_sql)
    except Error as e:
        print(e)

def main():
    database = r"dictionary_my.db"
    # описаниС столбцов словаря - id Π½ΠΎΠΌΠ΅Ρ€, слово ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
    sql_create_dictionary_table = """ CREATE TABLE IF NOT EXISTS dictionary (
                                        id integer PRIMARY KEY,
                                        word text,
                                        meaning text
                                    ); """


    # ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π±Π°Π·Π΅
    conn = create_connection(database)

    # созданиС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ dictionary
    if conn is not None:
        create_table(conn, sql_create_dictionary_table)
    else:
        print("Ошибка: Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ Π±Π°Π·Π΅.")


if __name__ == '__main__':
    main()
    
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста»

GUI интСрфСйс ΠΈ скрипт для Π½Π°Π±ΠΎΡ€Π° CRUD ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ

ГрафичСский интСрфСйс ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ стандартныС элСмСнты Tkinter ΠΈ нСсколько Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² модуля Ttk. Для позиционирования элСмСнтов Π½Π° повСрхности ΠΎΠΊΠ½Π° Π² Tkinter Π΅ΡΡ‚ΡŒ Ρ†Π΅Π»Ρ‹Ρ… Ρ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° – pack(), place() ΠΈ grid(). ΠœΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ послСдним, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ прСдусматриваСт ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ размСщСния. ΠŸΡ€ΠΈ использовании grid() всС пространство ΠΎΠΊΠ½Π° дСлится Π½Π° ряды row ΠΈ столбцы column. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ряд ΠΈ столбСц, Π½Π° пСрСсСчСнии ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ размСщаСтся:

(row = 2, column = 0)

Π•Ρ‰Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΡˆΠΈΡ€ΠΈΠ½Ρƒ элСмСнта, Ссли Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ соотвСтствовал ΡˆΠΈΡ€ΠΈΠ½Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… столбцов:

columnspan = 2
Π’ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс для CRUD

SQL-запросы ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ запрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°ΠΌ потрСбуСтся для извлСчСния ΠΈΠ· Π±Π°Π·Ρ‹ всСх слов, выглядит Ρ‚Π°ΠΊ:

'SELECT * FROM dictionary ORDER BY word DESC'

Π’ этом случаС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ упорядочСны ΠΏΠΎ Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌΡƒ порядку английских слов. Если Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ word Π½Π° meaning, слова Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ окаТутся упорядочСнными ΠΏΠΎ русскоязычному Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ.

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ add_word() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° для вставки Π½ΠΎΠ²ΠΎΠΉ записи:

'INSERT INTO dictionary VALUES(NULL, ?, ?)'

Π’ΠΎΠΏΡ€ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π·Π½Π°ΠΊΠ°ΠΌΠΈ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ (ΠΈΠ· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ»Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΡ‹) Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС:

parameters = (self.word.get(), self.meaning.get())
Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ± ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ слова

Для удалСния слова Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ строку. Π‘Π»ΠΎΠ²ΠΎ извлСкаСтся ΠΈΠ· Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ строки:

word = self.tree.item(self.tree.selection())['text']

И пСрСдаСтся Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ удалСния:

query = 'DELETE FROM dictionary WHERE word = ?'
self.run_query(query, (word, ))

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ рСдактирования ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ записи ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ поля Ρ„ΠΎΡ€ΠΌΡ‹ старыми значСниями – ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΠΎΠΌ слова ΠΈ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠΌ:

value = word
value = old_meaning
ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅ΠΉ Π² ΠΎΠΊΠ½Π΅ рСдактирования

Π­Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ сохранСнии записи Π½Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΠ»ΠΎΡΡŒ пустоС ΠΏΠΎΠ»Π΅ вмСсто ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ слова ΠΈΠ»ΠΈ значСния, Ссли ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π½ΠΈΡ… Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π²Π²Π΅Π» слово (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅) Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. А Π΅Ρ‰Π΅ это ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ исправлСниС ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΎΠΊ.

ЀактичСскоС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ записи производится ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ:

query = 'UPDATE dictionary SET word = ?, meaning = ? WHERE word = ? AND meaning = ?'
parameters = (new_word, new_meaning, word, old_meaning)

Π’ΠΎΡ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ для CRUD скрипта ΠΈ Π΅Π³ΠΎ интСрфСйса:

from tkinter import ttk
from tkinter import *
import sqlite3

class Dictionary:
    db_name = 'dictionary.db'

    def __init__(self, window):

        self.wind = window
        self.wind.title('Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ словаря')

        # созданиС элСмСнтов для Π²Π²ΠΎΠ΄Π° слов ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ
        frame = LabelFrame(self.wind, text = 'Π’Π²Π΅Π΄ΠΈΡ‚Π΅ Π½ΠΎΠ²ΠΎΠ΅ слово')
        frame.grid(row = 0, column = 0, columnspan = 3, pady = 20)
        Label(frame, text = 'Π‘Π»ΠΎΠ²ΠΎ: ').grid(row = 1, column = 0)
        self.word = Entry(frame)
        self.word.focus()
        self.word.grid(row = 1, column = 1)
        Label(frame, text = 'Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅: ').grid(row = 2, column = 0)
        self.meaning = Entry(frame)
        self.meaning.grid(row = 2, column = 1)
        ttk.Button(frame, text = 'Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ', command = self.add_word).grid(row = 3, columnspan = 2, sticky = W + E)
        self.message = Label(text = '', fg = 'green')
        self.message.grid(row = 3, column = 0, columnspan = 2, sticky = W + E)
        # Ρ‚Π°Π±Π»ΠΈΡ†Π° слов ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ
        self.tree = ttk.Treeview(height = 10, columns = 2)
        self.tree.grid(row = 4, column = 0, columnspan = 2)
        self.tree.heading('#0', text = 'Π‘Π»ΠΎΠ²ΠΎ', anchor = CENTER)
        self.tree.heading('#1', text = 'Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅', anchor = CENTER)

        # ΠΊΠ½ΠΎΠΏΠΊΠΈ рСдактирования записСй
        ttk.Button(text = 'Π£Π΄Π°Π»ΠΈΡ‚ΡŒ', command = self.delete_word).grid(row = 5, column = 0, sticky = W + E)
        ttk.Button(text = 'Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ', command = self.edit_word).grid(row = 5, column = 1, sticky = W + E)

        # Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹
        self.get_words()

    # ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ запрос ΠΊ Π±Π°Π·Π΅
    def run_query(self, query, parameters = ()):
        with sqlite3.connect(self.db_name) as conn:
            cursor = conn.cursor()
            result = cursor.execute(query, parameters)
            conn.commit()
        return result

    # Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ словами ΠΈ ΠΈΡ… значСниями
    def get_words(self):
        records = self.tree.get_children()
        for element in records:
            self.tree.delete(element)
        query = 'SELECT * FROM dictionary ORDER BY word DESC'
        db_rows = self.run_query(query)
        for row in db_rows:
            self.tree.insert('', 0, text = row[1], values = row[2])

    # валидация Π²Π²ΠΎΠ΄Π°
    def validation(self):
        return len(self.word.get()) != 0 and len(self.meaning.get()) != 0
    # добавлСниС нового слова
    def add_word(self):
        if self.validation():
            query = 'INSERT INTO dictionary VALUES(NULL, ?, ?)'
            parameters =  (self.word.get(), self.meaning.get())
            self.run_query(query, parameters)
            self.message['text'] = 'слово {} Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ'.format(self.word.get())
            self.word.delete(0, END)
            self.meaning.delete(0, END)
        else:
            self.message['text'] = 'Π²Π²Π΅Π΄ΠΈΡ‚Π΅ слово ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅'
        self.get_words()
    # ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ слова 
    def delete_word(self):
        self.message['text'] = ''
        try:
            self.tree.item(self.tree.selection())['text'][0]
        except IndexError as e:
            self.message['text'] = 'Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ слово, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ'
            return
        self.message['text'] = ''
        word = self.tree.item(self.tree.selection())['text']
        query = 'DELETE FROM dictionary WHERE word = ?'
        self.run_query(query, (word, ))
        self.message['text'] = 'Π‘Π»ΠΎΠ²ΠΎ {} ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ'.format(word)
        self.get_words()
    # Ρ€eΠ΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ слова ΠΈ/ΠΈΠ»ΠΈ значСния
    def edit_word(self):
        self.message['text'] = ''
        try:
            self.tree.item(self.tree.selection())['values'][0]
        except IndexError as e:
            self.message['text'] = 'Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ слово для измСнСния'
            return
        word = self.tree.item(self.tree.selection())['text']
        old_meaning = self.tree.item(self.tree.selection())['values'][0]
        self.edit_wind = Toplevel()
        self.edit_wind.title = 'Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ слово'

        Label(self.edit_wind, text = 'ΠŸΡ€Π΅ΠΆΠ½Π΅Π΅ слово:').grid(row = 0, column = 1)
        Entry(self.edit_wind, textvariable = StringVar(self.edit_wind, value = word), state = 'readonly').grid(row = 0, column = 2)
        
        Label(self.edit_wind, text = 'НовоС слово:').grid(row = 1, column = 1)
        # ΠΏΡ€Π΅Π΄Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ поля
        new_word = Entry(self.edit_wind, textvariable = StringVar(self.edit_wind, value = word))
        new_word.grid(row = 1, column = 2)


        Label(self.edit_wind, text = 'ΠŸΡ€Π΅ΠΆΠ½Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:').grid(row = 2, column = 1)
        Entry(self.edit_wind, textvariable = StringVar(self.edit_wind, value = old_meaning), state = 'readonly').grid(row = 2, column = 2)
 
        Label(self.edit_wind, text = 'НовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:').grid(row = 3, column = 1)
        # ΠΏΡ€Π΅Π΄Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ поля
        new_meaning= Entry(self.edit_wind, textvariable = StringVar(self.edit_wind, value = old_meaning))
        new_meaning.grid(row = 3, column = 2)

        Button(self.edit_wind, text = 'Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ', command = lambda: self.edit_records(new_word.get(), word, new_meaning.get(), old_meaning)).grid(row = 4, column = 2, sticky = W)
        self.edit_wind.mainloop()
    # внСсСниС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π±Π°Π·Ρƒ
    def edit_records(self, new_word, word, new_meaning, old_meaning):
        query = 'UPDATE dictionary SET word = ?, meaning = ? WHERE word = ? AND meaning = ?'
        parameters = (new_word, new_meaning, word, old_meaning)
        self.run_query(query, parameters)
        self.edit_wind.destroy()
        self.message['text'] = 'слово {} ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ'.format(word)
        self.get_words()

if __name__ == '__main__':
    window = Tk()
    application = Dictionary(window)
    window.mainloop()

ΠœΠΎΠ΄ΡƒΠ»ΡŒ для запоминания слов ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

АнглийскиС слова ΠΈ ΠΈΡ… значСния Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Π² Π΄Π²Π° элСмСнта Listbox. Для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡˆΠΈΠ²Π°Π½ΠΈΡ слов ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² случайном порядкС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ shuffle ΠΈΠ· модуля random. Для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий (ΠΊΠ»ΠΈΠΊΠΎΠ²) ΠΏΠΎ спискам Listbox ΠΌΡ‹ напишСм Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – callback_left ΠΈ callback_right. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Listbox, Π½ΡƒΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ bind:

self.right.bind("<<ListboxSelect>>", self.callback_right)
self.left.bind("<<ListboxSelect>>", self.callback_left)
Π‘Π»ΠΎΠ²Π° ΠΈ значСния выводятся Π² случайном порядкС

Ѐункция callback_left отслСТиваСт ΠΊΠ»ΠΈΠΊΠΈ ΠΏΠΎ английским словам Π² Π»Π΅Π²ΠΎΠΌ элСмСнтС Listbox. Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΊΠ»ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΠΎ слову, функция посылаСт запрос Π² Π±Π°Π·Ρƒ:

'SELECT * from dictionary WHERE word = ?'

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ запроса – ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ запись:

record = cursor.fetchone()

Π’Ρ‚ΠΎΡ€ΠΎΠΉ элСмСнт записи record[2] являСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ слова, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ пСрСдаСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ callback_right.

Ѐункция callback_right ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ»ΠΈΠΊΠΈ ΠΏΠΎ значСниям слов Π² ΠΏΡ€Π°Π²ΠΎΠΌ спискС Listbox. Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΊΠ»ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, функция сравниваСт Π΅Π³ΠΎ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΈΠ· callback_left. Если ΠΎΠ½ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ – ΠΎΡ‚Π²Π΅Ρ‚ являСтся Π²Π΅Ρ€Π½Ρ‹ΠΌ, ΠΈ английскоС слово вмСстС с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΈΠ· Π»Π΅Π²ΠΎΠ³ΠΎ ΠΈ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ списков:

if click == self.trans:
    self.right.delete(ANCHOR)
    self.left.delete(ANCHOR)

Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС выводится сообщСниС ΠΎ Π½Π΅Π²Π΅Ρ€Π½ΠΎΠΌ ΠΎΡ‚Π²Π΅Ρ‚Π΅, Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ с ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠ³ΠΎ значСния снимаСтся.

Π’ GUI модуля для заучивания слов доступны Π΄Π²Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ: Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ для Π²Ρ‹Π·ΠΎΠ²Π° скрипта ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ интСрфСйса рСдактирования словаря, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΠ°Ρ‡Π°Ρ‚ΡŒ сначала для ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ слов ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ скрипт рСдактирования словаря, достаточно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

def run_edit(self):
    os.system('edit_dictionary.py')

НазначСниС ΠΊΠΎΠΌΠ°Π½Π΄ для ΠΊΠ½ΠΎΠΏΠΎΠΊ выглядит Ρ‚Π°ΠΊ:

ttk.Button(text="ΠΠ°Ρ‡Π°Ρ‚ΡŒ сначала", command=self.restart_program).grid(row = 4, column = 1, sticky = W + E)
ttk.Button(text="Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ", command=self.run_edit).grid(row = 4, column = 0, sticky = W + E)
Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ прямо ΠΈΠ· модуля запоминания слов

ДСйствиС для ΠΊΠ½ΠΎΠΏΠΊΠΈ Ρ…, которая ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ просто Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠΊΠ½ΠΎ ΠΈ останавливаСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΎΠΊΠ½ΠΎ подтвСрТдСния:

ΠŸΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄Π°

Для этого Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»:

self.wind.protocol("WM_DELETE_WINDOW", self.on_exit)

И Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

    def on_exit(self):
        if messagebox.askyesno("Π’Ρ‹ΠΉΡ‚ΠΈ", "Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ?"):
            self.wind.destroy()

Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ модуля word_match.py для запоминания ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ слов:

word_match.py
from tkinter import ttk
from tkinter import *
import random, os
import sqlite3

class Match:
    db_name = 'dictionary.db'

    def __init__(self, window):

        self.wind = window
        self.wind.title('Π£Ρ‡ΠΈΠΌ слова')
        self.eng, self.trans = str(), str()
        self.message = Label(text = '', fg = 'red')
        self.message.grid(row = 1, column = 0, columnspan = 2, sticky = W + E)
        # правая ΠΈ лСвая ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ
        self.left = Listbox(height = 12, exportselection=False, activestyle='none')
        self.left.grid(row = 2, column = 0)
        self.right = Listbox(height = 12, activestyle='none')
        self.right.grid(row = 2, column = 1)
        self.right.bind("<<ListboxSelect>>", self.callback_right)
        self.left.bind("<<ListboxSelect>>", self.callback_left)
        # Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Ρ…-ΠΊΠ½ΠΎΠΏΠΊΠ΅ ΠΎΠΊΠ½Π°
        ttk.Button(text="ΠΠ°Ρ‡Π°Ρ‚ΡŒ сначала", command=self.restart_program).grid(row = 4, column = 1, sticky = W + E)
        ttk.Button(text="Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ", command=self.run_edit).grid(row = 4, column = 0, sticky = W + E)
        self.wind.protocol("WM_DELETE_WINDOW", self.on_exit)
        # заполняСм колонки словами  
        self.get_words()
    #  Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎ ΠΊΠ»ΠΈΠΊΡƒ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ΅ Ρ…
    def on_exit(self):
        if messagebox.askyesno("Π’Ρ‹ΠΉΡ‚ΠΈ", "Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ?"):
            self.wind.destroy()
    #  ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π±Π°Π·Π΅ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° запроса
    def run_query(self, query, parameters = ()):
        with sqlite3.connect(self.db_name) as conn:
            cursor = conn.cursor()
            result = cursor.execute(query, parameters)
            conn.commit()
        return result
 
    # запрос Π½Π° ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ всСх ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… записСй ΠΈΠ· Π±Π°Π·Ρ‹ Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌ порядкС
    def get_words(self):
        query = 'SELECT * FROM dictionary ORDER BY word DESC'
        db_rows = self.run_query(query)
        # Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ словаря ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡˆΠ°Π½Π½Ρ‹Ρ… Π² случайном порядкС слов ΠΈ ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ
        lst_left, lst_right = [], []
        for row in db_rows:
            lst_left.append(row[1])
            lst_right.append(row[2])
        random.shuffle(lst_left)
        random.shuffle(lst_right)
        dic = dict(zip(lst_left, lst_right))
        # Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΈ Π»Π΅Π²ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ
        for k, v in dic.items():
            self.left.insert(END, k)
            self.right.insert(END, v)
    # ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠ»ΠΈΠΊΠ° ΠΏΠΎ словам Π² Π»Π΅Π²ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅
    def callback_left(self, event):
        self.message['text'] = ''
        if not event.widget.curselection():
            return
        # ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π±Π°Π·Ρ‹ значСния Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ слова
        w = event.widget
        idx = int(w.curselection()[0])
        self.eng = w.get(idx)
        with sqlite3.connect(self.db_name) as conn:
            cursor = conn.cursor()
            sqlite_select_query = 'SELECT * from dictionary WHERE word = ?'
            cursor.execute(sqlite_select_query, (self.eng,))
            record = cursor.fetchone()
            self.trans = record[2]
   
    # ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠ»ΠΈΠΊΠ° Π² ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅  
    def callback_right(self, event1):
        self.message['text'] = ''
        if not event1.widget.curselection():
            return
        
        w = event1.widget
        idx = int(w.curselection()[0])
        click = w.get(idx)
        # Ссли Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ΅ слово являСтся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠΌ, удаляСм ΠΈ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π», ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
        if click == self.trans:
            self.right.delete(ANCHOR)
            self.left.delete(ANCHOR)
        # сообщаСм ΠΎ Π½Π΅Π²Π΅Ρ€Π½ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ
        else:
            self.message['text'] = 'ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ'
            self.right.selection_clear(0, END)
    # Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΎΠΊΠ½ΠΎ ΠΈ скрипт рСдактирования словаря        
    def run_edit(self):
        os.system('edit_dictionary.py')
    # пСрСзапуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
    def restart_program(self):
        self.message['text'] = ''
        self.left.delete(0, END)
        self.right.delete(0, END)
        self.get_words()

if __name__ == '__main__':
    window = Tk()
    window.geometry('250x245+350+200')
    application = Match(window)
    window.mainloop()

Π“ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ доступСн Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅




Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

admin
11 дСкабря 2018

ООП Π½Π° Python: ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python допускаСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π½ΠΎ Π² Π΅Π³ΠΎ основС...
admin
23 фСвраля 2017

SQL Π·Π° 20 ΠΌΠΈΠ½ΡƒΡ‚

ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ Π²Π°ΡˆΠ΅ΠΌΡƒ вниманию ΡΡ‚Π°Ρ‚ΡŒΡŽ с ΠΊΡ€ΠΈΡ‡Π°Ρ‰ΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ "SQL Π·Π° 20 ΠΌΠΈΠ½ΡƒΡ‚". К...
admin
13 фСвраля 2017

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python: ΠΎΡ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ° Π΄ΠΎ профСссионала

Пошаговая инструкция для всСх, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒΒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python...