alekssamos

Lina_V3.3

Dec 30th, 2023 (edited)
824
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.26 KB | Source Code | 0 0
  1. import sqlite3
  2. import wx
  3. import wx.lib.scrolledpanel
  4. import random
  5. import sys
  6. import os
  7.  
  8.  
  9. class MyFrame(wx.Frame):
  10.     def __init__(self, parent, title):
  11.         screenSize = wx.DisplaySize()
  12.         screenWidth = screenSize[0]
  13.         screenHeight = screenSize[1]
  14.         self.wait = False
  15.         super().__init__(
  16.             parent, title =title, size=screenSize, style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER
  17.         )
  18.         if not os.path.exists(self.path_file("inf.db")):
  19.             conn = sqlite3.connect(self.path_file("inf.db"))
  20.             cursor = conn.cursor()
  21.             cursor.execute("CREATE TABLE chat (id INTEGER PRIMARY KEY, key TEXT, value TEXT)")
  22.             conn.commit()
  23.             cursor.close()
  24.         self.chat_panel = wx.Panel(self, size=(500,screenHeight))
  25.         self.vbox = wx.BoxSizer(wx.VERTICAL)
  26.         self.chat = wx.TextCtrl(self.chat_panel, style=wx.TE_MULTILINE)
  27.         self.send_btn = wx.Button(self.chat_panel, label="отправить")
  28.         self.education_btn = wx.Button(self.chat_panel, label="обучение")
  29.         self.answer = wx.StaticText(self.chat_panel, label="")
  30.         self.vbox.Add(self.chat, flag=wx.ALL, border=10)
  31.         self.vbox.Add(self.send_btn, flag=wx.ALL, border=10)
  32.         self.vbox.Add(self.education_btn, flag=wx.ALL, border=10)
  33.         self.vbox.Add(self.answer, flag=wx.ALL, border=10)
  34.         self.send_btn.Bind(wx.EVT_BUTTON, self.choice_answer)
  35.         self.education_btn.Bind(wx.EVT_BUTTON, self.show_education)
  36.         self.chat_panel.SetSizer(self.vbox)
  37.         self.vbox.Fit(self)
  38.         self.item_panel = wx.lib.scrolledpanel.ScrolledPanel(self, size=(700,screenHeight))
  39.         self.item_panel.SetupScrolling()
  40.         self.item_panel.Hide()
  41.         self.item_vbox = wx.BoxSizer(wx.VERTICAL)
  42.         self.chat_btn = wx.Button(self.item_panel, label="чат")
  43.         new_item_btn = wx.Button(self.item_panel, label="добавить")
  44.         self.item_vbox.Add(self.chat_btn, flag=wx.ALL, border=10)
  45.         self.item_vbox.Add(new_item_btn, flag=wx.ALL, border=10)
  46.         new_item_btn.Bind(wx.EVT_BUTTON, self.new_item)
  47.         self.chat_btn.Bind(wx.EVT_BUTTON, self.show_chat)
  48.         self.update_items()
  49.         self.item_panel.SetSizer(self.item_vbox)
  50.         self.item_vbox.Fit(self)
  51.         self.main_sizer = wx.BoxSizer(wx.VERTICAL)
  52.         self.main_sizer.Add(self.chat_panel, 1, wx.EXPAND, 0)
  53.         self.main_sizer.Add(self.item_panel, 1, wx.EXPAND, 0)
  54.         self.SetSizer(self.main_sizer)
  55.         self.main_sizer.Fit(self)
  56.         self.Layout()
  57.         self.Centre()
  58.  
  59.     def show_chat(self, e):
  60.         self.item_panel.Hide()
  61.         self.chat_panel.Show()
  62.         self.chat.SetFocus()
  63.         self.main_sizer.Fit(self)
  64.  
  65.     def show_education(self, e):
  66.         self.wait = False
  67.         self.answer.SetLabel("")
  68.         self.chat_panel.Hide()
  69.         self.item_panel.Show()
  70.         self.chat_btn.SetFocus()
  71.         self.main_sizer.Fit(self)
  72.  
  73.     def remove(self, e):
  74.         row_id = e.EventObject.GetId()
  75.         remove_dlg = wx.MessageDialog(
  76.             self,
  77.             "удалить эту фразу?",
  78.             "удаление",
  79.             wx.YES_NO | wx.ICON_QUESTION
  80.         )
  81.         answer = remove_dlg.ShowModal()
  82.         if answer ==  wx.ID_YES:
  83.             conn = sqlite3.connect(self.path_file("inf.db"))
  84.             cursor = conn.cursor()
  85.             cursor.execute("DELETE FROM chat WHERE id=?", (row_id,))
  86.             conn.commit()
  87.             cursor.close()
  88.             conn.close()
  89.             e.EventObject.Destroy()
  90.  
  91.     def new_item(self, e):
  92.         new_item_dlg = wx.TextEntryDialog(
  93.             self,
  94.             message="напиши фразу и ответ через дефис",
  95.             caption="добавить",
  96.             style=wx.OK
  97.         )
  98.         new_item_dlg.ShowModal()
  99.         value = new_item_dlg.GetValue()
  100.         value = value.split("-")
  101.         # убираем пробелы по краям
  102.         value = list(map(lambda x: x.strip(), value))
  103.         try:
  104.             item = (value[0], value[1])
  105.             conn = sqlite3.connect(self.path_file("inf.db"))
  106.             cursor = conn.cursor()
  107.             cursor.execute("INSERT INTO chat (key, value) VALUES (?, ?)", item)
  108.             conn.commit()
  109.             cursor.close()
  110.         except IndexError:
  111.             return
  112.         self.update_items()
  113.  
  114.     def update_items(self):
  115.         conn = sqlite3.connect(self.path_file("inf.db"))
  116.         cursor = conn.cursor()
  117.         result = cursor.execute("SELECT id, key, value FROM chat")
  118.         rows = cursor.fetchall()
  119.         for row in rows:
  120.             id, key, value = row
  121.             item_btn = wx.Button(self.item_panel, id=id, label=f"фраза: {key}, ответ: {value}")
  122.             self.item_vbox.Add(item_btn, flag=0, border=10)
  123.             item_btn.Bind(wx.EVT_BUTTON, self.remove)
  124.         self.item_vbox.Fit(self)
  125.         self.Layout()
  126.         cursor.close()
  127.         conn.close()
  128.  
  129.     def path_file(self, file_name):
  130.         if getattr(sys, 'frozen', False):
  131.             return os.path.join(sys._MEIPASS, file_name)
  132.         else:
  133.             return file_name
  134.  
  135.     def choice_answer(self, e):
  136.         self.text = self.chat.GetValue().strip() # убираем пробелы по краям
  137.         self.chat.SetValue("")
  138.         if self.wait == False:
  139.             self.show_answer()
  140.         else:
  141.             self.add_answer()
  142.             self.wait = False
  143.         self.vbox.Fit(self.answer)
  144.         self.answer.SetFocus()
  145.  
  146.     def add_answer(self):
  147.         save_answers = ["спасибо, я узнала", "спасибо, я поняла", "спасибо, всё понятно", "постараюсь это запомнить", "ок"]
  148.         item = (self.question, self.text)
  149.         conn = sqlite3.connect(self.path_file("inf.db"))
  150.         cursor = conn.cursor()
  151.         cursor.execute("INSERT INTO chat (key, value) VALUES (?, ?)", item)
  152.         conn.commit()
  153.         last_id = cursor.lastrowid
  154.         cursor.close()
  155.         self.answer.SetLabel(random.choice(save_answers))
  156.         id, key, value = (last_id, item[0], item[1])
  157.         item_btn = wx.Button(self.item_panel, id=id, label=f"фраза: {key}, ответ: {value}")
  158.         self.item_vbox.Add(item_btn, flag=0, border=10)
  159.         item_btn.Bind(wx.EVT_BUTTON, self.remove)
  160.         self.vbox.Fit(self.answer)
  161.  
  162.     def show_answer(self):
  163.         wait_answer = ["что я должна ответить", "что мне надо на это ответить", "что я должна сказать"]
  164.         conn = sqlite3.connect(self.path_file("inf.db"))
  165.         cursor = conn.cursor()
  166.         result = cursor.execute("SELECT value FROM chat WHERE key LIKE ?", ("%"+self.text+"%",))
  167.         values = result.fetchall()
  168.         if not values:
  169.             self.answer.SetLabel(random.choice(wait_answer))
  170.             self.vbox.Fit(self.answer)
  171.             self.wait = True
  172.         else:
  173.             self.answer.SetLabel(random.choice(values)[0])
  174.             self.vbox.Fit(self.answer)
  175.         self.question = self.text
  176.         conn.commit()
  177.         cursor.close()
  178.  
  179.  
  180. if __name__ == '__main__':
  181.     app = wx.App()
  182.     frame = MyFrame(None, "test")
  183.     frame.Show()
  184.     app.MainLoop()
  185.  
Advertisement
Add Comment
Please, Sign In to add comment