· 6 years ago · Mar 20, 2019, 10:52 PM
1from tkinter.filedialog import *
2from tkinter import simpledialog
3from sqlite3 import *
4import time
5
6
7class Editor(Frame):
8 def __init__(self, root, cursor, conn):
9 self.root = root
10 self.cursor = cursor
11 self.connection = conn
12 self.root.title('Program za rad s bazom podataka')
13 super().__init__(self.root)
14 self.StvoriTablicu()
15 self.KreirajSucelje()
16 self.UÄitajIzBaze()
17 mainloop()
18
19 def KreirajSucelje(self):
20 self.Naljepnice = {}
21 self.Entries = []
22 lista_naljepnica = ['Knjiga', 'Autor', 'Žanr', 'IzdavaÄka kuća', 'Godina izdanja']
23
24 for i in range(len(lista_naljepnica)):
25 self.Naljepnice[i] = Label(self, text=lista_naljepnica[i])
26 self.Naljepnice[i].grid(row=1, column=i)
27
28 # tekst okviri
29 entry = Entry(self)
30 entry.grid(row=2, column=i)
31 self.Entries.append(entry)
32
33 #novi entry i gumb za brisanje
34 self.a=Button(self, text='Izbriši',command=lambda: self.Izbriši())
35 self.a.grid(row=5, column=5)
36 self.b=Entry(self)
37 self.b.grid(row=5,column=4)
38
39
40 self.UnesiGumb = Button(self, text='Unesi', command=lambda: (self.UnesiUBazu(), self.UÄitajIzBaze()))
41 self.UnesiGumb.grid(row=2, column=len(lista_naljepnica))
42 self.pack(fill=BOTH, expand=True)
43
44 self.Labela = Label(self.root, text='Dobrodošli')
45 self.Labela.pack(fill=BOTH, expand=True)
46
47 # trake za pomicanje
48 self.T = Text(self.root, wrap=NONE, spacing1=5)
49 self.T.pack(fill=BOTH, expand=True)
50
51 ys = Scrollbar(self.root, orient=VERTICAL)
52 ys.pack(side=RIGHT, fill=Y)
53 xs = Scrollbar(self.root, orient=HORIZONTAL)
54 xs.pack(side=BOTTOM, fill=X)
55
56 self.DBName = Label(self.root, text='Trenutna baza podataka: '+ os.path.dirname(__file__) + '/inital_datebase.db')
57 self.DBName.pack(fill=BOTH, expand=True)
58
59 self.T.configure(xscrollcommand=xs.set, yscrollcommand=ys.set)
60 ys.configure(command=self.T.yview)
61 xs.configure(command=self.T.xview)
62
63 # izbornici
64 mB = Menu(self.root)
65
66 mD = Menu(mB, tearoff=1)
67 mD.add_command(label='Nova baza', underline=0, accelerator='Ctrl+N', command=lambda: self.NovaBaza())
68 mD.add_command(label='UÄitaj bazu', underline=0, accelerator='Ctrl+N', command=lambda: self.UÄitajBazu())
69 mD.add_separator()
70 mD.add_command(label='Završi rad', underline=0, accelerator='Ctrl+Q', command=lambda: self.Kraj())
71 mB.add_cascade(menu=mD, label='Upravljanje')
72
73 uM = Menu(mB, tearoff=1)
74 uM.add_command(label='Knjiga', underline=0, command=lambda: self.UÄitajIzBaze('Knjiga'))
75 uM.add_command(label='Autor', underline=0, command=lambda: self.UÄitajIzBaze('Autor'))
76 uM.add_command(label='Žanr', underline=0, command=lambda: self.UÄitajIzBaze('Žanr'))
77 uM.add_command(label='IzdavaÄkaKuća', underline=0, command=lambda: self.UÄitajIzBaze('IzdavaÄkaKuća'))
78 uM.add_command(label='GodinaIzdanja', underline=0, command=lambda: self.UÄitajIzBaze('GodinaIzdanja'))
79 mB.add_cascade(menu=uM, label='Sortiraj')
80
81 self.root.config(menu=mB)
82
83 def Izbriši(self):
84 upit='''DELETE FROM Knjige WHERE Knjiga=={}'''.format(self.b.get())
85 self.cursor.execute(upit)
86 self.connection.commit()
87
88
89
90
91
92 def NovaBaza(self):
93 answer = simpledialog.askstring("Input", "Ime baze (.db format)",
94 parent=self.root)
95
96 if answer is None: return # ako nista korisnik ne unese
97
98 # neispravno ime za bazu
99 if answer[-3:] != '.db':
100 self.Obavijest('Krivi format imena baze!', 'red')
101 return
102
103 # ako je ispravno ime za bazu
104 # zatvaramo inicijalnu bazu
105 self.connection.commit()
106 self.connection.close()
107 self.cursor = ''
108
109 # otvaramo novu
110 self.connection = connect(answer)
111 self.cursor = self.connection.cursor()
112 self.Obavijest('Nova baza napravljena!', 'green')
113 self.StvoriTablicu()
114 self.DBName.configure(text=('Trenutna baza podataka: ' + os.path.dirname(__file__) + '/' + answer))
115 self.UÄitajIzBaze()
116
117 def UÄitajBazu(self):
118
119 fname = askopenfilename(filetypes=[('Datoteke SQL', '*.db')], title='Odaberi datoteku')
120
121 if len(fname) == 0: return # ako nista korisnik ne unese
122
123 # zatvaramo inicijalnu bazu
124 self.connection.commit()
125 self.connection.close()
126 self.cursor = ''
127
128 # otvaramo novu
129 self.connection = connect(fname)
130 self.cursor = self.connection.cursor()
131 self.Obavijest('Nova baza uÄitana!', 'green')
132 self.DBName.configure(text=('Trenutna baza podataka: ' + fname))
133 self.UÄitajIzBaze()
134
135 def Kraj(self, e=None):
136 self.connection.commit()
137 self.connection.close()
138 self.root.destroy()
139
140 def Obavijest(self, text, boja):
141 self.Labela.configure(text=text, bg=boja, fg='white')
142 self.root.update()
143
144 time.sleep(1.5)
145
146 self.Labela.configure(text='---', fg='black')
147 self.Labela['bg'] = Label(self.root)['bg']
148 self.root.update()
149
150 # ----------FUKCIJE ZA RAD S BAZOM-------------
151 def UnesiUBazu(self):
152 upit = 'INSERT INTO Knjige (Knjiga, Autor, Žanr, IzdavaÄkaKuća, GodinaIzdanja)\
153 VALUES ('
154
155 for entry in self.Entries:
156 upit += '"' + str(entry.get()) + '", '
157 entry.delete(0, END)
158
159
160 upit = upit[:-2] + ')'
161
162 # spremi u bazu
163 self.cursor.execute(upit)
164 self.connection.commit()
165 self.Obavijest('Nova knjiga unesena u bazu!', 'green')
166
167 def StvoriTablicu(self):
168 upit = '''CREATE TABLE IF NOT EXISTS Knjige (
169 Knjiga TEXT NOT NULL, \
170 Autor TEXT NOT NULL, \
171 Žanr TEXT NOT NULL, \
172 IzdavaÄkaKuća TEXT NOT NULL, \
173 GodinaIzdanja TEXT NOT NULL)'''
174
175 self.cursor.execute(upit)
176 self.connection.commit()
177
178 def UÄitajIzBaze(self, sortedBy='Knjiga'):
179 upit = 'SELECT Knjiga, Autor, Žanr, IzdavaÄkaKuća, GodinaIzdanja \
180 FROM Knjige \
181 ORDER BY ' + sortedBy + ' ASC'
182
183 data = self.cursor.execute(upit)
184 data = self.ObraditPodatke(data)
185 self.T.delete('1.0', END)
186 self.T.insert(0.0, data)
187 self.Obavijest('UÄitana tablica -> sortirano po: ' + sortedBy, 'green')
188
189 def ObraditPodatke(self, data):
190 stringData = '-' * 135 + '\n'
191 stringData += '| {}| {}| {}| {}| {}|'.format('Knjiga' + (' ' * 19),'Autor' + (' ' * 20), \
192 'Žanr' + (' ' * 21), 'IzdavaÄkaKuća' + (' ' * 12), 'GodinaIzdanja' + (' ' * 12)) + '\n'
193 stringData += '-' * 135
194
195 for row in data:
196 stringData += '\n| '
197 for cell in row:
198 cell_str = str(cell) + (25 - len(str(cell))) * ' ' + '| '
199 stringData += cell_str
200
201 stringData += '\n'
202
203 return stringData
204
205
206if __name__ == '__main__':
207 # prvo uspstavljamo komunikaciju s bazom
208 conn = connect('inital_datebase.db')
209 cursor = conn.cursor()
210
211 # otvaramo suÄelje
212 e = Editor(Tk(), cursor, conn)