код не хочет работать
после добавления строки 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 стоял на один таб дальше чем нужно(