Задание
Ввести и сохранить в файле данные следующей структуры: ф.,и.,о. водителя, номер и марка автомашины (5-7 марок), год приобретения, количество нарушений.
Организовать просмотр исходных данных и вывести список нарушителей (сортировка по количеству нарушений по возрастанию метод Шелла), с указанием ф.,и.,о. водителя, номера машины и количества нарушений.
Ввод и вывод данных организовать в виде таблиц. Отладку программы производить на примере файла, состоящего не менее чем из 15 записей. Кроме этой версии, мной написана еще одна с базой данных.
Функционал программы
- выводит данные в соответствие с заданием
- добавление данных
- редактирование данных
- удаление данных
- поиск данных
- обновление данных.
Содержание отчета к программе
1 Теоретические основы разработки приложений на языке Python. 4
1.1 Python как современный язык программирования. 4
1.2 Сравнение библиотек tkInter, PyQt, wxPython и их сравнение с WinForms 6
1.3 Пример разработки приложения на языке Python с графическим интерфейсом. 17
2 Практическая часть. 21
2.1 Постановка и описание задачи. 21
2.2 Техническое задание на разработку приложения «ГАИ. Учёт нарушений ПДД» 21
2.3 Описание процесса разработки приложения «ГАИ. Учёт нарушений ПДД». 22
2.4 Техническое задание на разработку приложения «ГАИ. Учёт нарушений ПДД (расширенная версия)». 26
2.5 Описание процесса разработки приложения «ГАИ. Учёт нарушений ПДД (расширенная версия)». 28
Заключение. 33
Список использованных источников. 34
Приложение. 35
Приложение А. Полный код программы. 35
Приложение Б. Полный код программы (версия с базой данных) 36
Фрагмент программного кода
import tkinter as tk class DriverTable(tk.Tk): def __init__(self, drivers): super().__init__() self.title("Driver Information") self.table = tk.Frame(self) self.table.pack() headings = ['Full Name', 'Car Number', 'Car Brand', 'Violations'] for i, heading in enumerate(headings): label = tk.Label(self.table, text=heading, relief=tk.RIDGE) label.grid(row=0, column=i, sticky="nsew") for i, driver in enumerate(drivers): label = tk.Label(self.table, text=driver.full_name, relief=tk.RIDGE) label.grid(row=i + 1, column=0, sticky="nsew") label = tk.Label(self.table, text=driver.car_number, relief=tk.RIDGE) label.grid(row=i + 1, column=1, sticky="nsew") label = tk.Label(self.table, text=driver.car_brand, relief=tk.RIDGE) label.grid(row=i + 1, column=2, sticky="nsew") label = tk.Label(self.table, text=driver.violations, relief=tk.RIDGE) label.grid(row=i + 1, column=3, sticky="nsew") for i in range(4): self.table.columnconfigure(i, weight=1) for i in range(len(drivers) + 1): self.table.rowconfigure(i, weight=1) if __name__ == "__main__": class Driver: def __init__(self, full_name, car_number, car_brand, year_of_purchase, violations): self.full_name = full_name self.car_number = car_number self.car_brand = car_brand self.year_of_purchase = year_of_purchase self.violations = violations def read_data(filename): drivers = [] with open(filename, 'r', encoding='utf-8') as file: for line in file: data = line.strip().split(', ') driver = Driver(data[0], data[1], data[2], int(data[3]), int(data[4])) drivers.append(driver) return drivers def shell_sort(drivers): n = len(drivers) gap = n // 2 while gap > 0: for i in range(gap, n): temp = drivers[i] j = i while j >= gap and drivers[j - gap].violations > temp.violations: drivers[j] = drivers[j - gap] j -= gap drivers[j] = temp gap //= 2 filename = 'data.txt' drivers = read_data(filename) shell_sort(drivers) app = DriverTable(drivers) app.mainloop()
Фрагмент программного кода
import tkinter as tk from tkinter import ttk import sqlite3 from PIL import ImageTk import customtkinter # customtkinter.set_appearance_mode("dark") # customtkinter.set_default_color_theme("dark-blue") # Класс Main def open_update_dialog(): Update() class Main(customtkinter.CTkFrame): def __init__(self, master): super().__init__(master) self.tree = None self.refresh_img = ImageTk.PhotoImage(file='refresh.png') self.search_img = ImageTk.PhotoImage(file='search.png') self.delete_img = ImageTk.PhotoImage(file='delete.png') self.update_img = ImageTk.PhotoImage(file='edit.png') self.add_img = ImageTk.PhotoImage(file='add.png') self.init_main() self.db = db self.view_records() # Главное окно def init_main(self): title_label = tk.Label(root, text="Учёт нарушений", font=("Arial", 15, "bold"), border=12, relief=tk.GROOVE, bg="blue", foreground="yellow") title_label.pack(side=tk.TOP, fill=tk.X) toolbar = tk.Frame(bg='beige', bd=2) toolbar.pack(side=tk.TOP, fill=tk.X) btn_open_dialog = tk.Button(toolbar, text='Добавить нарушение', command=self.open_dialog, bg='beige', bd=0, compound=tk.TOP, image=self.add_img) btn_open_dialog.pack(side=tk.LEFT) btn_edit_dialog = tk.Button(toolbar, text='Редактировать', bg='beige', bd=0, image=self.update_img, compound=tk.TOP, command=open_update_dialog) btn_edit_dialog.pack(side=tk.LEFT) btn_delete_dialog = tk.Button(toolbar, text='Удалить', bg='beige', bd=0, image=self.delete_img, compound=tk.TOP, command=self.delete_records) btn_delete_dialog.pack(side=tk.LEFT) btn_search = tk.Button(toolbar, text='Поиск', bg='beige', bd=0, image=self.search_img, compound=tk.TOP, command=self.open_search_dialog) btn_search.pack(side=tk.LEFT) btn_refresh = tk.Button(toolbar, text='Обновить', bg='beige', bd=0, image=self.refresh_img, compound=tk.TOP, command=self.view_records) btn_refresh.pack(side=tk.LEFT) columns = ('ID', 'full_name', 'brand', 'violations') self.tree = ttk.Treeview(self, columns=columns, height=15, show='headings') self.tree.column('ID', width=30, anchor=tk.CENTER) self.tree.column('full_name', width=365, anchor=tk.CENTER) self.tree.column('brand', width=120, anchor=tk.CENTER) self.tree.column('violations', width=110, anchor=tk.CENTER) self.tree.heading('ID', text='ID') self.tree.heading('full_name', text='ФИО') self.tree.heading('brand', text='Марка') self.tree.heading('violations', text='Нарушения') self.tree.pack(side=tk.LEFT) scroll = tk.Scrollbar(self, command=self.tree.yview) scroll.pack(side=tk.LEFT, fill=tk.Y) self.tree.configure(yscrollcommand=scroll.set)
Структура проекта
Скриншот архива с проектом
Пояснения по запуску программы
Для запуска приложения необходимо скачать python с оффициального сайта, установить. Скачать PyCharm с оффициального сайта - https://www.jetbrains.com/pycharm/download/#section=windows, выбираем версию Community, устанавливаем, ставим все галочки. С помощью клика по правой кнопке мыши (ПКМ), открываем папку с проектом.
admin