π Python, Tkinter ΠΈ SQL: ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ»ΠΎΠ²Π°ΡΠ΅ΠΉ ΠΈ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΡ ΠΈΠ½ΠΎΡΡΡΠ°Π½Π½ΡΡ ΡΠ»ΠΎΠ²
ΠΠ·ΡΡΠ°Π΅ΠΌ Tkinter ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ SQL-ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π² Ρ ΠΎΠ΄Π΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ WordMatch Ρ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ ΠΈ CRUD-ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ Π΄Π»Ρ ΡΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ ΡΠ»ΠΎΠ²Π°ΡΠ΅ΠΉ.
ΠΠ±Π·ΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ WordMatch Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΡΡΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΈ Π²ΠΌΠ΅ΡΡΠ΅, ΠΈ ΠΏΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΡΡΠΈ:
- Π‘ΠΊΡΠΈΠΏΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π°ΡΡ.
- GUI ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΈ Π½Π°Π±ΠΎΡ CRUD ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π΄Π»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ, ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² ΡΠ»ΠΎΠ²Π°ΡΠ΅.
- GUI ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΈ ΡΠΊΡΠΈΠΏΡ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΠΈ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈΠ½ΠΎΡΡΡΠ°Π½Π½ΡΡ ΡΠ»ΠΎΠ² ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, Π²ΡΠ²Π΅Π΄Π΅Π½Π½ΡΡ Π² ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅.
Π§ΡΠΎ ΠΌΡ ΠΈΠ·ΡΡΠΈΠΌ
- ΠΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , Π²ΡΠΏΠΎΠ»Π½ΡΡΡ CRUD ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΈ Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΡΠ·ΡΠΊΠ΅ SQL.
- ΠΠ°ΠΊ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠΎΠ±ΡΡΠΈΡ Π² ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°Ρ Listbox.
- ΠΠ°ΠΊ Π½Π°Π·Π½Π°ΡΠΈΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ΅ Π·Π°ΠΊΡΡΡΠΈΡ ΠΎΠΊΠ½Π°.
Π‘ΠΊΡΠΈΠΏΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ»ΠΎΠ²Π°ΡΡ
Π‘Π»ΠΎΠ²Π°ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ SQLite, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Ρ Python ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ Π½Π΅ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π½Π°Π±ΠΎΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ 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 Π² Π½Π΅ΠΉ Π±ΡΠ» ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½ ΡΠΊΡΠΈΠΏΡΠΎΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ:
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
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 Π΄Π»Ρ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΠ»ΠΎΠ²:
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()
ΠΠΎΡΠΎΠ²ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ.
ΠΠ°ΡΠ΅ΡΠΈΠ°Π»Ρ ΠΏΠΎ ΡΠ΅ΠΌΠ΅
- ΠΠ°ΠΊ ΠΏΠΎΠ΄ΡΡΠΆΠΈΡΡ Python ΠΈ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ SQL. ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ
- SQL Π·Π° 20 ΠΌΠΈΠ½ΡΡ
- π Π ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ SQL Π΄Π»Ρ Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΡ
. Π§Π°ΡΡΡ 1: ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
, ΡΠ°Π±Π»ΠΈΡ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ²ΡΠ·Π΅ΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π±Π»ΠΈΡΠ°ΠΌΠΈ