· 5 years ago · Jun 03, 2020, 03:56 AM
1from urllib.request import urlopen
2from tkinter import *
3from random import uniform
4from tkinter import font as tkfont
5from tkinter import messagebox
6from tkinter import filedialog
7import matplotlib.pyplot as plt
8import json
9import sqlite3
10
11# Create window home Tkinter
12home = Tk()
13home.title("Aplikasi Data Tanaman");home.geometry("600x300")
14
15# Databases
16# create a database or connect to one
17conn = sqlite3.connect("kebun.db")
18
19# Create cursor
20kursor = conn.cursor()
21
22# Create table data_pohon
23kursor.execute("""CREATE TABLE IF NOT EXISTS data_pohon (
24 id_tree INTEGER PRIMARY KEY,
25 sensor_tree INTEGER,
26 loc_lat REAL,
27 loc_lon REAL,
28 date TEXT
29 )""")
30
31# Create tabel sensor_pohon if not exists
32kursor.execute("""CREATE TABLE IF NOT EXISTS data_sensor(
33 id_tree INTEGER PRIMARY KEY, date_time TEXT,
34 air_temp REAL, air_hum REAL,
35 rainfall REAL, uv_lvl REAL,
36 soil_temp REAL, soil_hum REAL,
37 soil_ph REAL, n_ph REAL,
38 p_ph REAL, k_ph REAL
39 )""")
40
41# Create submit function for database
42def get_loc():
43 tree = id_tree.get()
44 sensor = sensor_tree.get()
45 # connect to api
46 address = f"https://belajar-python-unsyiah.an.r.appspot.com/sensor/read?npm=1904105010004&id_tree={tree}&sensor_type={sensor}"
47 # open Url
48 url = urlopen(address)
49 # read url
50 documents = url.read().decode("utf-8")
51 # process
52 data = json.loads(documents)
53 # Get data
54 result_id = f"{data['id_tree']}"
55 result_sensor = f"{data['sensor_type']}"
56 result_date = f"{data['when']}"
57 # Search Random location Latitude & Longitude
58 for i in range(100):
59 loc_lat = uniform(1, 20)
60 for j in range(100):
61 loc_lon = uniform(1, 360)
62
63 # create a database or connect to one
64 conn = sqlite3.connect("kebun.db")
65 # Create cursor
66 kursor = conn.cursor()
67 # Insert Into Table data_pohon
68 kursor.execute("INSERT INTO data_pohon VALUES (:id_tree, :sensor_tree, :loc_lat, :loc_lon, :date)",
69 {
70 'id_tree': result_id,
71 'sensor_tree': result_sensor,
72 'loc_lat': loc_lat,
73 'loc_lon': loc_lon,
74 'date': result_date
75 })
76
77 # Commit changes
78 conn.commit()
79 # Close connection
80 conn.close()
81
82 # Clear The Text Boxes
83 id_tree.delete(0, END)
84 sensor_tree.delete(0, END)
85
86# Create Function to Sensor Tree
87def option_sensor():
88 def ambil_data():
89 tree = id_tree.get()
90 # Create variabel
91 result_api = []
92 # Get data
93 for sensor_type in range(10):
94 address = f"https://belajar-python-unsyiah.an.r.appspot.com/sensor/read?npm=1904105010004&id_tree={tree}&sensor_type={sensor_type}"
95 url = urlopen(address)
96 documents = url.read().decode("utf-8")
97 data = json.loads(documents)
98 result_api.append(data['value'])
99
100 id_kopi = f"{data['id_tree']}"
101 date_time = f"{data['when']}"
102
103
104 # create Database
105 conn = sqlite3.connect("kebun.db")
106 # Create kursor
107 kursor = conn.cursor()
108
109 # Insert data in Table
110 kursor.execute("INSERT INTO data_sensor VALUES (:id_tree, :date_time, :air_temp, :air_hum, :rainfall, :uv_lvl, :soil_temp, :soil_hum, :soil_ph, :n_ph, :p_ph, :k_ph)",
111 {
112 'id_tree': id_kopi,'date_time': date_time,
113 'air_temp': result_api[0],'air_hum': result_api[1],
114 'rainfall': result_api[2],'uv_lvl': result_api[3],
115 'soil_temp': result_api[4],'soil_hum': result_api[5],
116 'soil_ph': result_api[6],'n_ph': result_api[7],
117 'p_ph': result_api[8],'k_ph': result_api[9]
118 })
119 # Commit changes
120 conn.commit()
121 # Close connection
122 conn.close()
123 id_tree.delete(0, END)
124
125 def show_data():
126 opsi_show = Tk()
127 opsi_show.title("Semua Data Sensor")
128 opsi_show.geometry("600x500")
129
130 # connect database
131 conn = sqlite3.connect("kebun.db")
132 # Create cursor
133 kursor = conn.cursor()
134 # Result the database
135 kursor.execute("SELECT *, oid FROM data_sensor")
136 records = kursor.fetchall()
137
138 # loop thur result
139 print_records = ""
140 for record in records:
141 #Print for looping
142 print_records += f"\n\nID : {record[0]}\nDate : {record[1]}\n\nAir Temperature : {record[2]} | Air Humidity : {record[3]} | Rainfall : {record[4]} | UV Level : {record[5]}\nSoil Temperature : {record[6]} | Soil Humidity : {record[7]} | Soil pH : {record[8]}\nN Level : {record[9]} | P Level : {record[10]} | K Level : {record[11]}"
143
144 # Result in label
145 title_sensor_result = Label(opsi_show, text="Daftar Data Semua Sensor Setiap ID", font="chilanka")
146 title_sensor_result.grid(row=1, column=0, columnspan=2)
147 sensor_result = Label(opsi_show, text=print_records, font="chilanka");sensor_result.grid(row=2, column=0, rowspan=40, columnspan=2, padx=10, pady=10)
148
149 def air_temp():
150 # connect database
151 conn = sqlite3.connect("kebun.db")
152 # Create cursor
153 kursor = conn.cursor()
154 # Result database from data_sensor
155 kursor.execute("SELECT *, oid FROM data_sensor")
156 records = kursor.fetchall()
157
158 # Create variabel
159 x = []
160 y = []
161 for air_temp in records:
162 x.append(air_temp[1])
163 y.append(air_temp[2])
164
165 # Create plot
166 plt.plot(x, y, '-o')
167 plt.title('Air Temperature')
168 plt.show()
169
170 # connect close
171 conn.close()
172 def air_hum():
173 # connect database
174 conn = sqlite3.connect("kebun.db")
175 # Create cursor
176 kursor = conn.cursor()
177 # Result database from data_sensor
178 kursor.execute("SELECT *, oid FROM data_sensor")
179 records = kursor.fetchall()
180
181 # Create variabel
182 x = []
183 y = []
184 for air_hum in records:
185 x.append(air_hum[1])
186 y.append(air_hum[3])
187
188 # Create plot
189 plt.plot(x, y, '-o')
190 plt.title('Air Humidity')
191 plt.show()
192
193 # connect close
194 conn.close()
195 def rainfall():
196 # connect database
197 conn = sqlite3.connect("kebun.db")
198 # Create cursor
199 kursor = conn.cursor()
200 # Result database from data_sensor
201 kursor.execute("SELECT *, oid FROM data_sensor")
202 records = kursor.fetchall()
203
204 # Create variabel
205 x = []
206 y = []
207 for rainfall in records:
208 x.append(rainfall[1])
209 y.append(rainfall[4])
210
211 # Create plot
212 plt.plot(x, y, '-o')
213 plt.title('Rainfall')
214 plt.show()
215
216 # connect close
217 conn.close()
218
219 def uv_lvl():
220 # connect database
221 conn = sqlite3.connect("kebun.db")
222 # Create cursor
223 kursor = conn.cursor()
224 # Result database from data_sensor
225 kursor.execute("SELECT *, oid FROM data_sensor")
226 records = kursor.fetchall()
227
228 # Create variabel
229 x = []
230 y = []
231 for uv_lvl in records:
232 x.append(uv_lvl[1])
233 y.append(uv_lvl[5])
234
235 # Create plot
236 plt.plot(x, y, '-o')
237 plt.title('UV Level')
238 plt.show()
239
240 # connect close
241 conn.close()
242 def soil_temp():
243 # connect database
244 conn = sqlite3.connect("kebun.db")
245 # Create cursor
246 kursor = conn.cursor()
247 # Result database from data_sensor
248 kursor.execute("SELECT *, oid FROM data_sensor")
249 records = kursor.fetchall()
250
251 # Create variabel
252 x = []
253 y = []
254 for soil_temp in records:
255 x.append(soil_temp[1])
256 y.append(soil_temp[6])
257
258 # Create plot
259 plt.plot(x, y, '-o')
260 plt.title('Soil Temperature')
261 plt.show()
262
263 # connect close
264 conn.close()
265 def soil_hum():
266 # connect database
267 conn = sqlite3.connect("kebun.db")
268 # Create cursor
269 kursor = conn.cursor()
270 # Result database from data_sensor
271 kursor.execute("SELECT *, oid FROM data_sensor")
272 records = kursor.fetchall()
273
274 # Create variabel
275 x = []
276 y = []
277 for uv_lvl in records:
278 x.append(uv_lvl[1])
279 y.append(uv_lvl[7])
280
281 # Create plot
282 plt.plot(x, y, '-o')
283 plt.title('Soil Humidity')
284 plt.show()
285
286 # connect close
287 conn.close()
288 def soil_ph():
289 # connect database
290 conn = sqlite3.connect("kebun.db")
291 # Create cursor
292 kursor = conn.cursor()
293 # Result database from data_sensor
294 kursor.execute("SELECT *, oid FROM data_sensor")
295 records = kursor.fetchall()
296
297 # Create variabel
298 x = []
299 y = []
300 for soil_ph in records:
301 x.append(soil_ph[1])
302 y.append(soil_ph[8])
303
304 # Create plot
305 plt.plot(x, y, '-o')
306 plt.title('Soil pH')
307 plt.show()
308
309 # connect close
310 conn.close()
311 def n_lvl():
312 # connect database
313 conn = sqlite3.connect("kebun.db")
314 # Create cursor
315 kursor = conn.cursor()
316 # Result database from data_sensor
317 kursor.execute("SELECT *, oid FROM data_sensor")
318 records = kursor.fetchall()
319
320 # Create variabel
321 x = []
322 y = []
323 for n_ph in records:
324 x.append(n_ph[1])
325 y.append(n_ph[9])
326
327 # Create plot
328 plt.plot(x, y, '-o')
329 plt.title('N Level')
330 plt.show()
331
332 # connect close
333 conn.close()
334 def p_lvl():
335 # connect database
336 conn = sqlite3.connect("kebun.db")
337 # Create cursor
338 kursor = conn.cursor()
339 # Result database from data_sensor
340 kursor.execute("SELECT *, oid FROM data_sensor")
341 records = kursor.fetchall()
342
343 # Create variabel
344 x = []
345 y = []
346 for p_ph in records:
347 x.append(p_ph[1])
348 y.append(p_ph[10])
349
350 # Create plot
351 plt.plot(x, y, '-o')
352 plt.title('P Level')
353 plt.show()
354
355 # connect close
356 conn.close()
357 def k_lvl():
358 # connect database
359 conn = sqlite3.connect("kebun.db")
360 # Create cursor
361 kursor = conn.cursor()
362 # Result database from data_sensor
363 kursor.execute("SELECT *, oid FROM data_sensor")
364 records = kursor.fetchall()
365
366 # Create variabel
367 x = []
368 y = []
369 for p_ph in records:
370 x.append(p_ph[1])
371 y.append(p_ph[11])
372
373 # Create plot
374 plt.plot(x, y, '-o')
375 plt.title('K Level')
376 plt.show()
377
378 # connect close
379 conn.close()
380 def total_sensor():
381 # connect database
382 conn = sqlite3.connect("kebun.db")
383 # Create cursor
384 kursor = conn.cursor()
385 # Result database from data_sensor
386 kursor.execute("SELECT *, oid FROM data_sensor")
387 records = kursor.fetchall()
388
389 rst_sensor = 2
390 for one_tipe in range(0, 10):
391 x = []
392 y = []
393 for row in records:
394 x.append(row[0])
395 y.append(row[rst_sensor])
396 rst_sensor += 1
397
398 plt.plot(x, y, '-o')
399 plt.title('Hasil Sensor Semua Tanaman')
400 plt.legend(['Suhu Udara', 'Kelembaban Udara', 'Curah Hujan', 'Sinar UV', 'SUhu Tanah', 'Kelembaban Tanah', 'pH Tanah', 'N Level', 'P Level','K Level'])
401 plt.xlabel('ID Kopi')
402 plt.ylabel('Sensor_type')
403 plt.show()
404
405 conn.close()
406
407 global option_sensor
408 option_sensor = Tk()
409 option_sensor.title("Sensor Tanaman")
410 option_sensor.geometry("540x450")
411
412 # Create text box
413 id_tree = Entry(option_sensor, width=30)
414 id_tree.grid(row=3, column=1, pady=5)
415 # Create Label
416 id_tree_lbl = Label(option_sensor, text="ID Tanaman\t: ", font="Purisa")
417 id_tree_lbl.grid(row=3, column=0, pady=5)
418 # Create Button
419 id_tree_btn = Button(option_sensor, text="Tambahkan Data", command=ambil_data, font="chilanka")
420 id_tree_btn.grid(row=6, column=0, columnspan=1, pady=11, padx=11, ipadx=27)
421 result_btn = Button(option_sensor, text="Tampilkan Semua Data", command=show_data, font="chilanka")
422 result_btn.grid(row=6, column=1, columnspan=6, pady=12, padx=12, ipadx=5)
423 # Create Button Graph
424 # air_temp
425 air_temp_btn = Button(option_sensor, text="Suhu udara", font="chilanka", command=air_temp)
426 air_temp_btn.grid(row=8, column=0, columnspan=1, pady=10, padx=10, ipadx=48)
427 # air_hum
428 air_hum_btn = Button(option_sensor, text="Kelembaban udara", font="chilanka", command=air_hum)
429 air_hum_btn.grid(row=9, column=0, columnspan=1, pady=11, padx=11, ipadx=22)
430 # rainfall
431 rainfall_btn = Button(option_sensor, text="Curah Hujan", font="chilanka", command=rainfall)
432 rainfall_btn.grid(row=10, column=0, columnspan=1,pady=11, padx=11, ipadx=44)
433 # uv_lvl
434 uv_lvl_btn = Button(option_sensor, text="UV Level", font="chilanka", command=uv_lvl)
435 uv_lvl_btn.grid(row=11, column=0, columnspan=1, pady=11, padx=11, ipadx=58)
436 # soil_temp
437 soil_temp_btn = Button(option_sensor, text="Suhu Tanah", font="chilanka", command=soil_temp)
438 soil_temp_btn.grid(row=12, column=0, columnspan=1, pady=11, padx=11, ipadx=45)
439 # soil_hum
440 soil_hum_btn = Button(option_sensor, text="Kelembaban Tanah", font="chilanka", command=soil_hum)
441 soil_hum_btn.grid(row=8, column=1, columnspan=1, pady=11, padx=11, ipadx=15)
442 #soil_ph
443 soil_ph_btn = Button(option_sensor, text="ph Tanah", font="chilanka", command=soil_ph)
444 soil_ph_btn.grid(row=9, column=1, columnspan=1, pady=11, padx=11, ipadx=50)
445 #n_lvl
446 n_lvl_btn = Button(option_sensor, text="N Level", font="chilanka", command=n_lvl)
447 n_lvl_btn.grid(row=10, column=1, columnspan=1, pady=11, padx=11, ipadx=60)
448 # p_lvl
449 p_lvl_btn = Button(option_sensor, text="P Level", font="chilanka", command=p_lvl)
450 p_lvl_btn.grid(row=11, column=1, columnspan=1, pady=11, padx=11, ipadx=60)
451 # k_lvl
452 k_lvl_btn = Button(option_sensor, text="K Level", font="chilanka", command=k_lvl)
453 k_lvl_btn.grid(row=12, column=1, columnspan=1, pady=11, padx=11, ipadx=60)
454 # Show all_grafik
455 all_grafik_btn = Button(option_sensor, text="Tampilkan Semua Grafik", font="chilanka", command=total_sensor)
456 all_grafik_btn.grid(row=13, column=0, columnspan=2, pady=11, padx=11, ipadx=22)
457
458
459
460 # Main Loop
461 option_sensor.mainloop()
462
463
464# Create Function to Delete A Record
465def option_delete():
466 global option_delete
467 option_delete = Tk()
468 option_delete.title("Hapus Data")
469 option_delete.geometry('450x200')
470 # delete from ID data
471 def delete_1():
472 # create a database or connect to one
473 conn = sqlite3.connect("kebun.db")
474 # Create cursor
475 # Create a Delete Button
476 kursor = conn.cursor()
477 # Delete a record
478 kursor.execute("DELETE FROM data_pohon WHERE oid = " + delete_box.get())
479 kursor.execute("DELETE FROM data_sensor WHERE oid = " + delete_box.get())
480 delete_box.delete(0, END)
481 # Commit changes
482 conn.commit()
483 # Close connection
484 conn.close()
485
486 # Delete a Tabel data_pohon
487 def delete_2():
488 # create a database or connect to one
489 conn = sqlite3.connect("kebun.db")
490 # Create cursor
491 kursor = conn.cursor()
492 # Delete a tabel
493 kursor.execute("DROP TABLE IF EXISTS data_pohon;")
494 # Create table data_pohon
495 kursor.execute("""CREATE TABLE IF NOT EXISTS data_pohon (
496 id_tree INTEGER PRIMARY KEY, sensor_tree INTEGER,
497 loc_lat REAL, loc_lon REAL, date TEXT)""")
498
499 kursor.execute("DROP TABLE IF EXISTS data_sensor;")
500 # Create Tabel sensor_pohon
501 # Create tabel sensor_pohon if not exists
502 kursor.execute("""CREATE TABLE IF NOT EXISTS data_sensor(
503 id_tree INTEGER PRIMARY KEY, date_time TEXT,
504 air_temp REAL, air_hum REAL,
505 rainfall REAL, uv_lvl REAL,
506 soil_temp REAL, soil_hum REAL,
507 soil_ph REAL, n_ph REAL,
508 p_ph REAL, k_ph REAL
509 )""")
510 # Commit changes
511 conn.commit()
512 # Close connection
513 conn.close()
514
515 # Create Text Boxes
516 delete_box = Entry(option_delete, width=30)
517 delete_box.grid(row=3, column=1, pady=5)
518 # Create a label delete
519 delete_box_lbl = Label(option_delete, text="Select ID : ", font="Purisa")
520 delete_box_lbl.grid(row=3, column=0, pady=5)
521 # Create a Delete Button
522 delete_btn = Button(option_delete, text="Hapus Data ID", command=delete_1, font="chilanka")
523 delete_btn.grid(row=4, column=1, columnspan=1, pady=11, padx=11, ipadx=27)
524 # Create a Delete All Button
525 del_all_btn = Button(option_delete, text="Hapus Semua Data", command=delete_2, font="chilanka")
526 del_all_btn.grid(row=5, column=1, columnspan=1, ipadx=7)
527
528 # Main loop
529 option_delete.mainloop()
530
531# Create result function
532def result():
533 option_result = Tk()
534 option_result.title("Tampilkan Data")
535 option_result.geometry("900x450")
536
537 # create a database or connect to one
538 conn = sqlite3.connect("kebun.db")
539 # Create cursor
540 kursor = conn.cursor()
541 # Result the database
542 kursor.execute("SELECT *, oid FROM data_pohon")
543 records = kursor.fetchall()
544
545 # loop thur Result
546 print_records = ""
547 for record in records:
548 # Print for looping
549 print_records += f"\n\n id pohon : {record[0]} | no. : {record[1]} | Latitude : - {record[2]:1.7f} | Longitude : {record[3]:1.7f} | Date : {record[4]}"
550
551 # Result in box
552 title_result = Label(option_result, text="Daftar Data Koordinat ID dan Sensor", font="chilanka")
553 title_result.grid(row=1,column=0, columnspan=2)
554 result_lbl = Label(option_result, text=print_records, font="chilanka")
555 result_lbl.grid(row=2, column=0, rowspan=40, columnspan=2, padx=10, pady=10)
556 # Commit changes
557 conn.commit()
558 # Close connection
559 conn.close()
560
561 #Main loop
562 option_result.mainloop()
563
564def exit_window():
565 answer = messagebox.askquestion("Keluar", "Anda yakin keluar dari Aplikasi?")
566 if answer == 'yes':
567 quit()
568
569def save_data():
570 def save_data1():
571 # create a database or connect to one
572 conn = sqlite3.connect("kebun.db")
573 # Create cursor
574 kursor = conn.cursor()
575 # Result the database
576 kursor.execute("SELECT *, oid FROM data_pohon")
577 records = kursor.fetchall()
578
579 # loop thur Result
580 print_records = ""
581 for record in records:
582 # Print for looping
583 print_records += f"\n\n id pohon : {record[0]} | no. : {record[1]} | Latitude : - {record[2]:1.7f} | Longitude : {record[3]:1.7f} | Date : {record[4]}"
584
585 f = filedialog.asksaveasfile(mode='w', defaultextension=".txt")
586 if f is None:
587 return
588
589 f.write(print_records)
590 f.close()
591
592 def save_data2():
593 # create a database or connect to one
594 conn = sqlite3.connect("kebun.db")
595 # Create cursor
596 kursor = conn.cursor()
597 # Result the database
598 kursor.execute("SELECT *, oid FROM data_sensor")
599 records = kursor.fetchall()
600
601 # loop thur Result
602 print_records = ""
603 for record in records:
604 # Print for looping
605 print_records += f"\n\nID : {record[0]}\nDate : {record[1]}\n\nAir Temperature : {record[2]} | Air Humidity : {record[3]} | Rainfall : {record[4]} | UV Level : {record[5]}\nSoil Temperature : {record[6]} | Soil Humidity : {record[7]} | Soil pH : {record[8]}\nN Level : {record[9]} | P Level : {record[10]} | K Level : {record[11]}"
606
607 f = filedialog.asksaveasfile(mode='w', defaultextension=".txt")
608 if f is None:
609 return
610
611 f.write(print_records)
612 f.close()
613
614 global opsi_savedata
615 opsi_savedata = Tk()
616 opsi_savedata.title("Save Records Data")
617 opsi_savedata.geometry("250x150")
618
619 save_1 = Button(opsi_savedata, text="Save Semua Data\nKoordinat Pohon", font="chilanka", command=save_data1)
620 save_1.grid(row=4, column=1, columnspan=1, pady=11, padx=11, ipadx=27)
621 save_2 = Button(opsi_savedata, text="Save Semua Data\nSensor Pohon", font="chilanka", command=save_data2)
622 save_2.grid(row=5, column=1, columnspan=1, ipadx=27)
623
624# Create Text Boxes
625id_tree = Entry(home, width=20)
626id_tree.grid(row=0, column=1, padx=20, pady=(10,0))
627sensor_tree = Entry(home, width=20)
628sensor_tree.grid(row=1, column=1)
629
630# Create Text Box Labels
631id_tree_lbl = Label(home, text="ID Tanaman\t\t\t: ", font="Purisa")
632id_tree_lbl.grid(row=0, column=0, pady=(10,0))
633sensor_tree_lbl = Label(home, text="No. Koordinat (0 s/d 9)\t: ", font="Purisa")
634sensor_tree_lbl.grid(row=1, column=0)
635
636# Create text my identity
637identitas_diri = Label(home, text="Fathul Basyair\nNPM : 1904105010004", font="chilanka")
638identitas_diri.grid(row=11,column=0, columnspan=3, pady=12, padx=12)
639
640
641# Create get_data Button
642get_data_btn = Button(home, text="Tambahkan Data", font="chilanka", command=get_loc)
643get_data_btn.grid(row=6, column=0, columnspan=1, pady=10, padx=10, ipadx=42)
644
645# Create Result Button
646result_btn = Button(home, text="Tampilkan\nKoordinat", font="chilanka",command=result)
647result_btn.grid(row=7, column=0, columnspan=1, ipadx=63)
648
649# Create Delete Button
650delete_btn = Button(home, text="Hapus Data", font="chilanka", command=option_delete)
651delete_btn.grid(row=8, column=0, columnspan=1, ipadx=60)
652
653# Create an Sensor Button
654sensor_btn = Button(home, text="Sensor Tanaman", font="chilanka", command=option_sensor)
655sensor_btn.grid(row=6, column=1, columnspan=2, pady=11, padx=11, ipadx=22)
656
657#Create an save data in file button
658save_btn = Button(home, text="Simpan Data\nKedalam File", font="chilanka", command=save_data)
659save_btn.grid(row=7, column=1, columnspan=2, pady=11, padx=11, ipadx=40)
660
661# exit button
662exit_btn = Button(home, text="Keluar", font="chilanka", command=exit_window)
663exit_btn.grid(row=8, column=1, columnspan=2, ipadx=64)
664
665
666# Commit changes
667conn.commit()
668# Close connection
669conn.close()
670# Main loop
671home.mainloop()