当前位置:   article > 正文

Python程序设计课程设计——实验设备管理系统设计_python课设

python课设

实验设备管理系统的目的主要是为了解决实验室设备管理的需求。假设如果实验室使用了这个系统,可以更方便地进行设备信息的录入、查询、统计和报修等操作,大大提高了设备管理的效率和准确性。

写这篇文章目的性是为了给写程序的学生做参考,提供思路,希望学生能够从这篇文章学到自己想要的知识。

使用tkinter和sqlite3方法编写

  1. import tkinter as tk
  2. from tkinter import simpledialog, messagebox
  3. import sqlite3
  4. class DeviceManagementApp:
  5. def __init__(self, root):
  6. self.root = root
  7. self.root.title("设备管理系统")
  8. self.root.geometry("400x300")
  9. # 创建四个按钮,每个按钮对应一个模块
  10. btn_add = tk.Button(root, text="增加设备", command=self.show_add_device_window)
  11. btn_add.pack(pady=10)
  12. btn_delete = tk.Button(root, text="删除设备", command=self.delete_device)
  13. btn_delete.pack(pady=10)
  14. btn_edit = tk.Button(root, text="修改设备", command=self.edit_device)
  15. btn_edit.pack(pady=10)
  16. btn_reserve = tk.Button(root, text="预约设备", command=self.reserve_device)
  17. btn_reserve.pack(pady=10)
  18. btn_view_devices = tk.Button(root, text="查看设备", command=self.show_all_devices)
  19. btn_view_devices.pack(pady=10)
  20. # 初始化数据库
  21. self.initialize_database()
  22. # 添加输入框作为实例变量
  23. self.entry_device_number = None
  24. self.entry_device_type = None
  25. self.entry_device_name = None
  26. self.entry_device_price = None
  27. self.entry_purchase_date = None
  28. self.entry_is_scrapped = None
  29. self.entry_scrap_date = None
  30. def initialize_database(self):
  31. self.conn = sqlite3.connect("devices.db")
  32. self.cursor = self.conn.cursor()
  33. # 创建设备表
  34. self.cursor.execute('''
  35. CREATE TABLE IF NOT EXISTS devices (
  36. id INTEGER PRIMARY KEY AUTOINCREMENT,
  37. device_number TEXT NOT NULL,
  38. device_type TEXT NOT NULL,
  39. device_name TEXT NOT NULL,
  40. device_price REAL NOT NULL,
  41. purchase_date DATE NOT NULL,
  42. is_scrapped BOOLEAN NOT NULL,
  43. scrap_date DATE,
  44. is_reserved BOOLEAN DEFAULT 0, -- 添加默认值
  45. UNIQUE(device_number)
  46. )
  47. ''')
  48. self.conn.commit()
  49. def show_add_device_window(self):
  50. add_device_window = tk.Toplevel(self.root)
  51. add_device_window.title("增加设备")
  52. add_device_window.geometry("300x250")
  53. # 创建输入框和标签
  54. tk.Label(add_device_window, text="设备编号:").pack(pady=5)
  55. self.entry_device_number = tk.Entry(add_device_window)
  56. self.entry_device_number.pack(pady=5)
  57. tk.Label(add_device_window, text="设备种类:").pack(pady=5)
  58. self.entry_device_type = tk.Entry(add_device_window)
  59. self.entry_device_type.pack(pady=5)
  60. tk.Label(add_device_window, text="设备名称:").pack(pady=5)
  61. self.entry_device_name = tk.Entry(add_device_window)
  62. self.entry_device_name.pack(pady=5)
  63. tk.Label(add_device_window, text="设备价格:").pack(pady=5)
  64. self.entry_device_price = tk.Entry(add_device_window)
  65. self.entry_device_price.pack(pady=5)
  66. tk.Label(add_device_window, text="购入日期:").pack(pady=5)
  67. self.entry_purchase_date = tk.Entry(add_device_window)
  68. self.entry_purchase_date.pack(pady=5)
  69. tk.Label(add_device_window, text="是否报废:").pack(pady=5)
  70. self.entry_is_scrapped = tk.Entry(add_device_window)
  71. self.entry_is_scrapped.pack(pady=5)
  72. tk.Label(add_device_window, text="报废日期:").pack(pady=5)
  73. self.entry_scrap_date = tk.Entry(add_device_window)
  74. self.entry_scrap_date.pack(pady=5)
  75. # 创建确认按钮
  76. tk.Button(add_device_window, text="确认", command=self.add_device).pack(pady=10)
  77. def add_device(self):
  78. device_number = self.entry_device_number.get()
  79. device_type = self.entry_device_type.get()
  80. device_name = self.entry_device_name.get()
  81. device_price = self.entry_device_price.get()
  82. purchase_date = self.entry_purchase_date.get()
  83. is_scrapped = self.entry_is_scrapped.get()
  84. scrap_date = self.entry_scrap_date.get()
  85. # 检查设备编号是否已经存在
  86. self.cursor.execute("SELECT COUNT(*) FROM devices WHERE device_number=?", (device_number,))
  87. count = self.cursor.fetchone()[0]
  88. if count > 0:
  89. messagebox.showerror("错误", f"设备编号'{device_number}'已存在,请输入唯一的设备编号。")
  90. return
  91. try:
  92. # 将设备信息插入数据库
  93. self.cursor.execute(
  94. "INSERT INTO devices (device_number, device_type, device_name, device_price, purchase_date, is_scrapped, scrap_date) VALUES (?, ?, ?, ?, ?, ?, ?)",
  95. (device_number, device_type, device_name, device_price, purchase_date, is_scrapped, scrap_date)
  96. )
  97. self.conn.commit()
  98. messagebox.showinfo("成功", f"设备'{device_name}'添加成功!")
  99. except sqlite3.IntegrityError:
  100. messagebox.showerror("错误", f"设备编号'{device_number}'已存在,请输入唯一的设备编号。")
  101. def delete_device(self):
  102. # 创建删除设备的窗口
  103. delete_device_window = tk.Toplevel(self.root)
  104. delete_device_window.title("删除设备")
  105. delete_device_window.geometry("300x150")
  106. # 创建输入框和标签
  107. tk.Label(delete_device_window, text="设备编号:").pack(pady=5)
  108. entry_device_number = tk.Entry(delete_device_window)
  109. entry_device_number.pack(pady=5)
  110. # 创建确认按钮
  111. tk.Button(delete_device_window, text="确认删除",
  112. command=lambda: self.confirm_delete_device(entry_device_number.get(), delete_device_window)).pack(
  113. pady=10)
  114. def confirm_delete_device(self, device_number, delete_device_window):
  115. try:
  116. # 在数据库中删除相应设备信息
  117. self.cursor.execute("DELETE FROM devices WHERE device_number=?", (device_number,))
  118. self.conn.commit()
  119. messagebox.showinfo("成功", f"设备编号'{device_number}'删除成功!")
  120. # 关闭删除设备的窗口
  121. delete_device_window.destroy()
  122. # 刷新设备信息
  123. self.show_all_devices()
  124. except Exception as e:
  125. messagebox.showerror("错误", f"删除设备失败:{str(e)}")
  126. def edit_device(self):
  127. # 创建修改设备的窗口
  128. edit_device_window = tk.Toplevel(self.root)
  129. edit_device_window.title("修改设备")
  130. edit_device_window.geometry("300x150")
  131. # 创建输入框和标签
  132. tk.Label(edit_device_window, text="设备编号:").pack(pady=5)
  133. entry_device_number = tk.Entry(edit_device_window)
  134. entry_device_number.pack(pady=5)
  135. # 创建确认按钮
  136. tk.Button(edit_device_window, text="确认修改",
  137. command=lambda: self.confirm_edit_device(entry_device_number.get(), edit_device_window)).pack(pady=10)
  138. def confirm_edit_device(self, device_number, edit_device_window):
  139. # 在数据库中查询相应设备信息
  140. self.cursor.execute("SELECT * FROM devices WHERE device_number=?", (device_number,))
  141. device_info = self.cursor.fetchone()
  142. if device_info:
  143. # 关闭修改设备的窗口
  144. edit_device_window.destroy()
  145. # 打开设备信息修改页面
  146. self.show_edit_device_info(device_info)
  147. else:
  148. messagebox.showerror("错误", f"设备编号'{device_number}'不存在,请输入正确的设备编号。")
  149. def show_edit_device_info(self, device_info):
  150. # 创建设备信息修改的窗口
  151. edit_info_window = tk.Toplevel(self.root)
  152. edit_info_window.title("修改设备信息")
  153. edit_info_window.geometry("400x300")
  154. # 创建输入框和标签,并设置默认值为当前设备信息
  155. tk.Label(edit_info_window, text="设备编号:").grid(row=0, column=0, pady=5)
  156. entry_device_number = tk.Entry(edit_info_window)
  157. entry_device_number.grid(row=0, column=1, pady=5)
  158. entry_device_number.insert(0, device_info[1])
  159. tk.Label(edit_info_window, text="设备种类:").grid(row=1, column=0, pady=5)
  160. entry_device_type = tk.Entry(edit_info_window)
  161. entry_device_type.grid(row=1, column=1, pady=5)
  162. entry_device_type.insert(0, device_info[2])
  163. tk.Label(edit_info_window, text="设备名称:").grid(row=2, column=0, pady=5)
  164. entry_device_name = tk.Entry(edit_info_window)
  165. entry_device_name.grid(row=2, column=1, pady=5)
  166. entry_device_name.insert(0, device_info[3])
  167. tk.Label(edit_info_window, text="设备价格:").grid(row=3, column=0, pady=5)
  168. entry_device_price = tk.Entry(edit_info_window)
  169. entry_device_price.grid(row=3, column=1, pady=5)
  170. entry_device_price.insert(0, device_info[4])
  171. tk.Label(edit_info_window, text="购入日期:").grid(row=4, column=0, pady=5)
  172. entry_purchase_date = tk.Entry(edit_info_window)
  173. entry_purchase_date.grid(row=4, column=1, pady=5)
  174. entry_purchase_date.insert(0, device_info[5])
  175. tk.Label(edit_info_window, text="是否报废:").grid(row=5, column=0, pady=5)
  176. entry_is_scrapped = tk.Entry(edit_info_window)
  177. entry_is_scrapped.grid(row=5, column=1, pady=5)
  178. entry_is_scrapped.insert(0, device_info[6])
  179. tk.Label(edit_info_window, text="报废日期:").grid(row=6, column=0, pady=5)
  180. entry_scrap_date = tk.Entry(edit_info_window)
  181. entry_scrap_date.grid(row=6, column=1, pady=5)
  182. entry_scrap_date.insert(0, device_info[7])
  183. # 创建确认按钮
  184. tk.Button(edit_info_window, text="确认",
  185. command=lambda: self.confirm_save_edit(device_info[0], entry_device_number.get(),
  186. entry_device_type.get(), entry_device_name.get(),
  187. entry_device_price.get(), entry_purchase_date.get(),
  188. entry_is_scrapped.get(), entry_scrap_date.get(),
  189. edit_info_window)).grid(row=7, columnspan=2, pady=10)
  190. def confirm_save_edit(self, device_id, new_device_number, new_device_type, new_device_name, new_device_price,
  191. new_purchase_date, new_is_scrapped, new_scrap_date, edit_info_window):
  192. try:
  193. # 更新数据库中的设备信息
  194. self.cursor.execute(
  195. "UPDATE devices SET device_number=?, device_type=?, device_name=?, device_price=?, purchase_date=?, is_scrapped=?, scrap_date=? WHERE id=?",
  196. (new_device_number, new_device_type, new_device_name, new_device_price, new_purchase_date,
  197. new_is_scrapped, new_scrap_date, device_id)
  198. )
  199. self.conn.commit()
  200. messagebox.showinfo("成功", f"设备信息修改成功!")
  201. # 关闭设备信息修改的窗口
  202. edit_info_window.destroy()
  203. # 刷新设备信息
  204. self.show_all_devices()
  205. except Exception as e:
  206. messagebox.showerror("错误", f"修改设备信息失败:{str(e)}")
  207. def reserve_device(self):
  208. # 创建预约设备的窗口
  209. reserve_device_window = tk.Toplevel(self.root)
  210. reserve_device_window.title("预约设备")
  211. reserve_device_window.geometry("300x150")
  212. # 创建选择框和确认按钮
  213. choice_var = tk.StringVar()
  214. tk.Radiobutton(reserve_device_window, text="预约设备", variable=choice_var, value="reserve").pack(pady=5)
  215. tk.Radiobutton(reserve_device_window, text="释放设备", variable=choice_var, value="release").pack(pady=5)
  216. # 创建确认按钮
  217. tk.Button(reserve_device_window, text="确认",
  218. command=lambda: self.confirm_reserve_or_release(choice_var.get(), reserve_device_window)).pack(
  219. pady=10)
  220. def confirm_reserve_or_release(self, choice, reserve_device_window):
  221. # 关闭预约设备的窗口
  222. reserve_device_window.destroy()
  223. # 根据选择创建预约/释放设备的窗口
  224. if choice == "reserve":
  225. self.show_reserve_device_window()
  226. elif choice == "release":
  227. self.show_release_device_window()
  228. def show_reserve_device_window(self):
  229. # 创建预约设备的窗口
  230. reserve_window = tk.Toplevel(self.root)
  231. reserve_window.title("预约设备")
  232. reserve_window.geometry("300x150")
  233. # 创建输入框和标签
  234. tk.Label(reserve_window, text="设备编号:").pack(pady=5)
  235. entry_device_number = tk.Entry(reserve_window)
  236. entry_device_number.pack(pady=5)
  237. # 创建确认按钮
  238. tk.Button(reserve_window, text="确认预约",
  239. command=lambda: self.confirm_reserve_device(entry_device_number.get(), reserve_window)).pack(pady=10)
  240. def show_release_device_window(self):
  241. # 创建释放设备的窗口
  242. release_window = tk.Toplevel(self.root)
  243. release_window.title("释放设备")
  244. release_window.geometry("300x150")
  245. # 创建输入框和标签
  246. tk.Label(release_window, text="设备编号:").pack(pady=5)
  247. entry_device_number = tk.Entry(release_window)
  248. entry_device_number.pack(pady=5)
  249. # 创建确认按钮
  250. tk.Button(release_window, text="确认释放",
  251. command=lambda: self.confirm_release_device(entry_device_number.get(), release_window)).pack(pady=10)
  252. def confirm_reserve_device(self, device_number, reserve_window):
  253. try:
  254. # 查询设备是否已被预约
  255. self.cursor.execute("SELECT is_reserved FROM devices WHERE device_number=?", (device_number,))
  256. is_reserved = self.cursor.fetchone()[0]
  257. if not is_reserved:
  258. # 更新数据库中的设备信息,将设备设置为已预约
  259. self.cursor.execute("UPDATE devices SET is_reserved=1 WHERE device_number=?", (device_number,))
  260. self.conn.commit()
  261. messagebox.showinfo("成功", f"设备编号'{device_number}'预约成功!")
  262. # 关闭预约设备的窗口
  263. reserve_window.destroy()
  264. # 刷新设备信息
  265. self.show_all_devices()
  266. else:
  267. messagebox.showerror("错误", f"设备编号'{device_number}'已被预约,请选择其他设备。")
  268. except Exception as e:
  269. messagebox.showerror("错误", f"预约设备失败:{str(e)}")
  270. def confirm_release_device(self, device_number, release_window):
  271. try:
  272. # 查询设备是否已被预约
  273. self.cursor.execute("SELECT is_reserved FROM devices WHERE device_number=?", (device_number,))
  274. is_reserved = self.cursor.fetchone()[0]
  275. if is_reserved:
  276. # 更新数据库中的设备信息,将设备设置为未预约
  277. self.cursor.execute("UPDATE devices SET is_reserved=0 WHERE device_number=?", (device_number,))
  278. self.conn.commit()
  279. messagebox.showinfo("成功", f"设备编号'{device_number}'释放成功!")
  280. # 关闭释放设备的窗口
  281. release_window.destroy()
  282. # 刷新设备信息
  283. self.show_all_devices()
  284. else:
  285. messagebox.showinfo("提示", f"设备编号'{device_number}'未被预约,无需释放。")
  286. except Exception as e:
  287. messagebox.showerror("错误", f"释放设备失败:{str(e)}")
  288. def show_all_devices(self):
  289. # 创建一个新的窗口用于显示设备信息
  290. view_devices_window = tk.Toplevel(self.root)
  291. view_devices_window.title("查看设备")
  292. view_devices_window.geometry("500x400")
  293. # 创建一个文本框用于显示设备信息
  294. text_box = tk.Text(view_devices_window, wrap=tk.WORD)
  295. text_box.pack(pady=10)
  296. # 查询数据库,获取所有设备信息
  297. self.cursor.execute("SELECT * FROM devices")
  298. devices = self.cursor.fetchall()
  299. # 在文本框中显示设备信息
  300. for device in devices:
  301. text_box.insert(tk.END, f"设备编号: {device[1]}\n")
  302. text_box.insert(tk.END, f"设备种类: {device[2]}\n")
  303. text_box.insert(tk.END, f"设备名称: {device[3]}\n")
  304. text_box.insert(tk.END, f"设备价格: {device[4]}\n")
  305. text_box.insert(tk.END, f"购入日期: {device[5]}\n")
  306. text_box.insert(tk.END, f"是否报废: {device[6]}\n")
  307. text_box.insert(tk.END, f"报废日期: {device[7]}\n\n")
  308. # 设为只读
  309. text_box.config(state=tk.DISABLED)
  310. def show_message(self, title, message):
  311. messagebox.showinfo(title, message)
  312. def has_devices(self):
  313. self.cursor.execute("SELECT COUNT(*) FROM devices")
  314. count = self.cursor.fetchone()[0]
  315. return count > 0
  316. if __name__ == "__main__":
  317. root = tk.Tk()
  318. app = DeviceManagementApp(root)
  319. root.mainloop()

5.1测试用例

测试使用了一下数据

设备编号

设备种类

设备名称

设备价格

购入日期

是否报废

报废日期

1

打印机

墨盒

20.0

2023-1-1

2023-2-1

2

计算机

硬盘

1000.0

2023-12-23

3

计算机

主板

500.0

2022-2-5

2023-1-9

4

计算机

主板

200.0

2023-2-5

None

5

计算机

主板

8000.0

2023-2-5

None

程序运行结果

1.程序整体模块

图表 1exe文件运行页面

2.设备信息录入模块:

在点击增加设备后,出现一个独立页面显示需要添加的信息,使用者需要手动添加相应信息后确认。

图表 2增加设备

输入相应设备信息

图表 3加入一个设备信息

如果之前没有添加过此编号的设备信息,则会显示添加成功提示信息

图表 4添加成功提示

如果之前添加过此编号设备信息,则会显示已存在,并提示重新输入

图表 5添加错误提示

之后就可以在程序中添加入相应信息。

3.设备信息删除模块:

图表 6删除前设备总体信息

删除设备时,首先需要点击删除设备,并且会出现页面提示需要删除设备的编号

图表 7输入删除设备编号

之后会显示删除成功,并且相应的信息也会删除

图表 8删除成功提示信息

图表 9删除后信息页面

4.设备信息修改模块:

图表 10修改前信息

信息修改模块,点击信息修改后,需要使用者输入想要修改信息的编号,并且如果不存在这个设备,会提示此设备不存在

图表 11不存在提示页面

若存在则可以进行修改其中信息

图表 12修改信息页面

修改成功后,信息同步到数据库中

图表 13更新后信息

5.设备预约与释放模块:

点击预约设备后,可以选择预约或者释放设备

图表 14选择页面

图表 15选择预约或释放编号

如果设备被预约中,则无法预约,需要释放设备后才可以预约,同样的,如果设备想要释放,则需要正在预约中,否则也会释放失败,并且释放与预约时必须是存在的设备,否则也会提示错误

6.设备信息查看模块

点击查看设备按钮,则可以查看当前的所有设备信息

图表 16设备信息

技术力不强,并且代码存在一定bug,望谅解

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/731332
推荐阅读
相关标签
  

闽ICP备14008679号