код не хочет работать

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

после добавления строки sql,прога перестала даже запускаться, хз че делать код:

import sqlite3
from tkinter import *
from tkinter import messagebox, ttk
import random
import time
from tkinter.ttk import Treeview
class my_button:
    def __init__(self, text, font, x, y, width, window, command):
        self.window = window
        self.command = command
        self.visible= False
        
        self.button = Button(text=text, font=font, activebackground="purple",activeforeground="white")
        self.button.place(x=x, y=y, width=width)
        self.button.bind('<Button-1>', lambda event: self.click(self.command))
        
    def click(self, command):
        if command == "enter":
            self.enter()
        elif command == "show":
            self.show()
        elif command == "lider":
            self.lider_table()
            
    def lider_table(self):
        if not self.visible:
            self.window.show_table_lider()
            self.visible = True
        else:
            self.window.delete_table_lider()
            self.visible =False
            
            
    def show(self):
        if self.window.entry_password_entry.cget('show') == '':
            self.window.entry_password_entry.config(show='*')
        else:
            self.window.entry_password_entry.config(show='')
    def enter(self):     #поключение к базе данных
        global id_user
        self.value_login = self.window.entry_login.value.get()
        self.value_pass = self.window.entry_password.value.get()
        
        self.db = connect_db('avtoservis_users.db') #подлючаемся к базе данных
        
        self.sql = self.db.select_sql("SELECT * from users")
        for row in self.sql:
            self.db_id = row[0]
            self.db_login = row[1]
            self.db_pass = row[2]
            
            if self.value_login == self.db_login and self.value_pass == self.db_pass: #если логин и пароль введенные пользователем совпадают с данными с таблицы,то цикл прерывается, а в  переменной open находиться значение True
                self.open = True                                                      #Если совпадения не было,то в переменной open  находиться значение False. После чего база данных закрывается
                id_user = self.db_id
                if self.value_login == "admin":
                    self.admin = True
                break
            else:
                self.open = False
            
        self.db.close_db()
        
        if self.open and not self.admin:
            messagebox.showinfo("Внимание!","Доступ разрешен")
            self.window.destroy_main_window()
            
            self.work_window = my_window("Автосервис САС","800x800")
            self.work_window.canva_for_work_window()
            self.work_window.widget_for_work_window()
            self.work_window.visible_window()
            
        elif self.open and self.admin:
            messagebox.showinfo("Внимание!","Админ в сети")
            self.window.destroy_main_window()
            
            self.work_window = my_window("Панель управления","400x300")
            self.work_window.widget_for_admin_window()
            self.work_window.visible_window()
            
        else:
            messagebox.showerror("Внимание!","Не верный логин или пароль")
        



class my_entry:   #создаем поле для ввода
    def __init__(self, font, x, y, width, mask):
        self.value = StringVar()
        if mask == True:
            show = "$"
        else:
            show = ""
        self.entry = Entry(textvariable=self.value, font=font, show=show)
        self.entry.place(x=x, y=y, width=width)
class my_label:  #класс для создания текстовых надписей
    def __init__(self, text, font, bg, x, y):
        self.label = Label(text=text, font=font, bg=bg)
        self.label.place(x=x, y=y)
#быстрое подключение к базе данных
class connect_db:
    def __init__(self, db_name):
        self.db_name = db_name
        self.connector = sqlite3.connect(self.db_name)
        self.cursor = self.connector.cursor()
    def select_sql(self, sql_txt):
        self.sql_txt = sql_txt
        return self.cursor.execute(self.sql_txt)
    def insert_sql(self, sql_txt):
        self.insert_txt = sql_txt
        return self.cursor.execute(self.insert_txt)
    def close_db(self):
        self.connector.commit()
        self.cursor.close()
        self.connector.close()
        
class my_check_button: # добавление списка работ
    def __init__(self, text,font, bg, x, y):
        self.check_button = Checkbutton(text=text, font=font, bg=bg, state="disabled", disabledforeground="black") #класс="disabled" state делает виджет не доступным для изменения.    disabledforeground="black-меняет цвет виджета
    
        self.check_button.place(x=x, y=y)
        
    def set_state(self):
        self.check_button.configure(disabledforeground="green") #меняет состояние флажка с невыбранного на выбранный,а также меняет цвет в случае выполнение задачи
        self.check_button.select()


class my_window:       #класс для создания окон
    def __init__(self, title, size):
        self.window = Tk()
        self.window.geometry(size)
        self.window.resizable(False, False)
        self.window.title(title)
        self.window.configure(bg="purple")
        
        self.kol_avto = 0
        self.servis_finish = False
        
        self.servis1_crossed = False
        self.servis2_crossed = False
        self.servis3_crossed = False
        self.servis4_crossed = False
        
    def update_timer(self):  #обновление метки таймера на холсте
        global now_time
        now_time = int(time.time() - self.start_time)
        self.canva.itemconfigure(self.txt_timer, text="Время:"+str(now_time)+ "сек.")
        if not self.servis_finish:
            self.window.after(1000,self.update_timer)
        
        
    def visible_window(self):               #показывает окно в нужныый момент
        self.window.mainloop()
    def destroy_main_window(self):              #удаляет окно в нужный момент
        self.window.destroy()
    def widget_for_start_window(self):   #метод для добавление все в виджетов в окно входа
        self.label_title = my_label("ВХОД", "Arial 20 bold", "purple", 150, 50)
        self.label_login = my_label("Логин:", "Arial 15", "purple", 50, 150)
        self.label_password = my_label("Пароль:", "Arial 15", "purple", 50, 200)
        self.entry_login = my_entry("Arial 15", 150, 150, 150, False)
        self.entry_password = my_entry("Arial 15", 150, 200, 150, True)
        self.entry_password_entry = self.entry_password.entry
        self.enter_btn = my_button("ВХОД", "Arial 15", 150, 300, 100, self,
"enter")
        self.show_btn = my_button("☼", "Arial 12", 310, 200, 35, self, "show")
        
        self.lider_btn = my_button("Список лидеров", "Arial 10", 100, 350, 200, self, "lider")
        self.create_table_lider()
        
    def canva_for_work_window(self):    #cоздаем второй холст
        self.canva = Canvas(width=800, height=800, bg='lightblue')
        self.canva.pack()
        
        self.txt_timer = self.canva.create_text(80, 50, text="Время:0 сек.", font="Arial 15")
        
        
        self.work_place = self.canva.create_rectangle(500, 100, 650, 300, width=3, dash=(1, 1)) #создаем верхний прямоугольник
        self.work_place = self.canva.create_rectangle(500, 590, 650, 790, width=3, dash=(1, 1)) #создаем нижний прямоугольник
        
        self.txt_master = self.canva.create_text(600,320,font ="Arial 15", text = "мастерская" )
        self.txt_master = self.canva.create_text(600,570,font ="Arial 15", text = "гараж" )
        
        self.txt_kol_avto = self.canva.create_text(150,570,font ="Arial 15", text = "Количество машин "  +str(self.kol_avto)) #новая надпись на  холст
        
        self.txt_start = self.canva.create_text(400,450,font ="Arial 20 bold", text = "Нажмите что бы начать  пахать как не в себя",fill="red", activefill="green" )    #нажпись, при нажатие на которую начнется "рабочий день"
        
        self.canva.tag_bind(self.txt_start, '<Button-1>', lambda event, tag=self.txt_start: self.start_work())   #обртко события с помощью "tag_bind"
        
    def start_work(self):   #Метод для начала работы
        self.canva.delete(self.txt_start )  #Уничтожение надписи
        
        self.start_time = time.time() #записываем текущее время при начале работы
        self.update_timer()
        
        self.car_list =[
            PhotoImage(file="car1.png"),  #Создаем  список машин
            PhotoImage(file="car2.png"),
            PhotoImage(file="car3.png"),
            PhotoImage(file="car4.png"),
            PhotoImage(file="car5.png"),
            PhotoImage(file="car6.png"),
            PhotoImage(file="car7.png"),
            PhotoImage(file="car8.png")
            ]
        
        self.random_car = random.choice(self.car_list)  #Выбираем рандомную машину
        
        self.servis1_img = PhotoImage(file="s1.png")
        self.servis2_img = PhotoImage(file="s2.png")
        self.servis3_img = PhotoImage(file="s3.png")
        self.servis4_img = PhotoImage(file="s4.png")

        self.car = self.canva.create_image(580,690, image=self.random_car)  #Выбираем рандомную услугу
        
        self.canva.focus_set()  #передает фокус управления объектами холста
        self.canva.bind('<KeyPress>', self.move_car)
        
    def move_car(self,event):
        coords = self.canva.coords(self.car) #записываем  координаты в переменную "coords"
        
        if event.keysym == 'Left':  #при нажатие стрелку влево,машина будет двигаться налево,не уходя за пределы игрового экрана
            if coords[0]>=500:
                    self.canva.move(self.car, -20,0)
            else:
                self.canva.move(self.car,0,0)


        if event.keysym == 'Right':  #при нажатие стрелку  вправо,машина будет двигаться направо,не уходя за пределы игрового экрана
            if coords[0]<=720:
                    self.canva.move(self.car, 20,0)
            else:
                self.canva.move(self.car,0,0)
                
                
        if event.keysym == 'Up':  #при нажатие стрелку вверх,машина будет двигаться вверх,не уходя за пределы игрового экрана
            if coords[1]>=160:
                    self.canva.move(self.car, 0,-20)
            else:
                self.canva.move(self.car,0,0)
                
                
        if event.keysym == 'Down':  #при нажатие стрелку вниз,машина будет двигаться вниз,не уходя за пределы игрового экрана
            if coords[1]<=700:
                    self.canva.move(self.car, 0,20)
            else:
                self.canva.move(self.car,0,0)
                
                
        if 580 <= coords[0] <= 610 and 190 <coords[1] <=230 and self.servis_finish == False:
            messagebox.showinfo("Ура!", "Тачка на месте!")
            self.step1.set_state() #выполнение первой задачи(то есть должна появиться зеленая галочка)
            self.create_servis()
            self.canva.unbind('<KeyPress>')
            
        elif 560 <= coords[0] <= 610 and 670 <= coords[1] <= 750 and self.servis_finish == True:
            messagebox.showinfo("Ура","Дом,милый дом!")
            self.step6.set_state()#выполнение 6 задачи(то есть тоже должна появиться зеленая галочка)
            self.canva.unbind('<KeyPress>')
            
            self.kol_avto += 1
            self.canva.itemconfigure(self.txt_kol_avto, text="Количество машин:" + str(self.kol_avto)) #счетчик машин
            
            self.db = connect_db('avtoservis_users.db')    #добавление в базу данных
            self.db.insert_sql(f"INSERT INTO work_user (id_user, count_avto, sec) VALUES ('{id_user}','{self.kol_avto}', '{now_time}');")
            self.db.close_db()
            
            
            self.otvet = messagebox.askyesno("Далее", "Иди работай дальше!") #решение пользователя работать дальше или нет
            if self.otvet:
                self.reset_game()
            else:
                messagebox.showwarning("Окончание", "Поработал на славу салага! всего машин " + str(self.kol_avto))
                self.destroy_main_window()
    def reset_game(self):
        self.servis_finish = False
        self.servis1_crossed = False
        self.servis2_crossed = False
        self.servis3_crossed = False
        self.servis4_crossed = False
        
        self.canva.destroy()
        self.canva_for_work_window()
        self.widget_for_work_window()
            
            
    def create_servis(self): #отобразим услуги
        self.servis1 = self.canva.create_image(400,100, image=self.servis1_img)
        self.servis2 = self.canva.create_image(400,250, image=self.servis2_img)
        self.servis3 = self.canva.create_image(750,100, image=self.servis3_img)
        self.servis4 = self.canva.create_image(750,250, image=self.servis4_img)
        
        self.canva.tag_bind(self.servis1, '<Button-1>', lambda event, tag=self.servis1: self.cross_servis(tag)) #lдобавляем обратку событий на сами картинки услуг
        self.canva.tag_bind(self.servis2, '<Button-1>', lambda event, tag=self.servis2: self.cross_servis(tag))
        self.canva.tag_bind(self.servis3, '<Button-1>', lambda event, tag=self.servis3: self.cross_servis(tag))
        self.canva.tag_bind(self.servis4, '<Button-1>', lambda event, tag=self.servis4: self.cross_servis(tag))
        
    def cross_servis(self, tag):
        if tag == self.servis1 and not self.servis1_crossed:
            messagebox.showinfo("Работенка выполнена!", "Тачка полностью осмотрена!") #ивенты при нажатие на кнопку
            self.canva.create_line(350,50,450,150, fill ='red', width=5)
            self.servis1_crossed = True
            self.step2.set_state()
            
        elif tag == self.servis2 and not self.servis2_crossed:
            messagebox.showinfo("Работенка выполнена!", "Машина теперь блестит,как попа у младенца!") #ивенты при нажатие на кнопку
            self.canva.create_line(350,200,450,300, fill ='red', width=5)
            self.servis2_crossed = True
            self.step3.set_state()
        
        elif tag == self.servis3 and not self.servis3_crossed:
            messagebox.showinfo("Работенка выполнена!", "Тачка отремонтирована!") #ивенты при нажатие на кнопку
            self.canva.create_line(700,50,800,150, fill ='red', width=5)
            self.servis3_crossed = True
            self.step4.set_state()
        
        elif tag == self.servis4 and not self.servis4_crossed:
            messagebox.showinfo("Работенка выполнена!", "Теперь вашу машину не угонят!") #ивенты при нажатие на кнопку
            self.canva.create_line(700,200,800,300, fill ='red', width=5)
            self.servis4_crossed = True
            self.step5.set_state()
            
        if self.servis4_crossed and self.servis3_crossed and self.servis2_crossed and  self.servis1_crossed:  #делаем так,что бы машина могла поехать обратно в гараж,после выполнения всех услуг
            self.servis_finish = True
            self.canva.focus_set()
            self.canva.bind('<KeyPress>', self.move_car)
            
        

        
    def widget_for_work_window(self):   #отобразит все виджеты
        self.label_title = my_label("Сервисное обслуживание тачки", "Arial 20 bold", "lightblue",150,10) #текстовая надпись для заголовка
        
        self.step1 = my_check_button("Доставить тачку в сервис","Arial 15","lightblue",30,100)  #задачи для пользователя
        self.step2 = my_check_button("Провести тех.осмотр","Arial 15","lightblue",30,150)       #задачи для пользователя
        self.step3 = my_check_button("помыть тачку","Arial 15","lightblue",30,200)              #задачи для пользователя
        self.step4 = my_check_button("отремонтировать тачку","Arial 15","lightblue",30,250)     #задачи для пользователя
        self.step5 = my_check_button("установить сигнализацию","Arial 15","lightblue",30,300)   #задачи для пользователя
        self.step6 = my_check_button("отправить машину до дома","Arial 15","lightblue",30,350)  #задачи для пользователя
        
        self.info = my_label("Что бы отправить машину" +"\n"+"из гаража в мастерскую и обратно"+"\n"+"воспользуйтесь стрелочками", "Arial 15", "lightblue",10,650)  #подсказка для пользователя
        
        self.back_btn = my_button("назад", "Arial 10", 10, 750,50, self, back)
        

        
    def widget_for_admin_window(self):
        self.label_title = my_label("Панель управления", "Arial 20 bold", "lightblue",60,10)
        
        self.enter_btn = my_button("Добавить пользователя", 60, 100, 300, self, "new_user")
        self.enter_btn = my_button("Удалить пользователя", 60, 150, 300, self, "del_user")
        self.enter_btn = my_button("Изменить пароль пользователя", 60, 200, 300, self, "update_user")
        
        self.back_btn = my_button("Назад", "Arial 10", 10, 250, 50, self, "back")

    def create_table_lider(self):   #метод для создания таблицы
        self.tree = Treeview(columns=["user","min"], show="headings") #создаем таблицу
        
        self.tree.heading("user", text="пользователь")  #определяем заголовки
        self.tree.heading("min", text="рекорд, сек.")
        
        self.tree.column("user", width=100, anchor="c") #настраиваем таблицы
        self.tree.column("min", width=100, anchor="c")
        
        self.db = connect_db('avtoservis_users.db') #поключаемся к базе данных
        self.sql = self.db.select_sql("SELECT U.login, MIN(W.sec) FROM users U INNER JOIN work_user W ON U.id = W.id_user GROUP BY U.login ;")
        for row in self.sql:
            self.user = row[0]
            self.min_time = row[1]
            
            self.tree.insert("", END, values=[self.user, self.min_time])
            
            self.db.close_db()
    
    def show_table_lider(self):     #метод для показа таблица
        self.tree.pack()
    
    def delete_table_lider(self):      #метод для скрытия таблицы
        self.tree.pack_forget()

start_window=my_window("ВХОД", "400x400")
start_window.widget_for_start_window()
start_window.visible_window()           #делает окно видимым

ошибка: C:\Users\User>C:/Users/User/AppData/Local/Programs/Python/Python311/python.exe "c:/Users/User/Desktop/документы/информатика/DB Browser/pythonProject1/main.py" Traceback (most recent call last): File "c:\Users\User\Desktop\документы\информатика\DB Browser\pythonProject1\main.py", line 379, in start_window.widget_for_start_window() File "c:\Users\User\Desktop\документы\информатика\DB Browser\pythonProject1\main.py", line 167, in widget_for_start_window self.create_table_lider() File "c:\Users\User\Desktop\документы\информатика\DB Browser\pythonProject1\main.py", line 353, in create_table_lider self.sql = self.db.select_sql("SELECT U.login, MIN(W.sec) FROM users U INNER JOIN work_user W ON U.id = W.id_user GROUP BY U.login ;") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "c:\Users\User\Desktop\документы\информатика\DB Browser\pythonProject1\main.py", line 107, in select_sql return self.cursor.execute(self.sql_txt) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ sqlite3.OperationalError: no such table: users

оказалось что один self стоял на один таб дальше чем нужно(


Ответы (0 шт):