· 6 years ago · Mar 21, 2019, 12:12 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(), self.UÄitajIzBaze()))
35 self.a.grid(row=5, column=5)
36 self.b = Entry(self)
37 self.b.grid(row=5, column=4)
38
39 self.UnesiGumb = Button(self, text='Unesi', command=lambda: (self.UnesiUBazu(), self.UÄitajIzBaze()))
40 self.UnesiGumb.grid(row=2, column=len(lista_naljepnica))
41 self.pack(fill=BOTH, expand=True)
42
43 self.Labela = Label(self.root, text='Dobrodošli')
44 self.Labela.pack(fill=BOTH, expand=True)
45
46 # trake za pomicanje
47 self.T = Text(self.root, wrap=NONE, spacing1=5)
48 self.T.pack(fill=BOTH, expand=True)
49
50 ys = Scrollbar(self.root, orient=VERTICAL)
51 ys.pack(side=RIGHT, fill=Y)
52 xs = Scrollbar(self.root, orient=HORIZONTAL)
53 xs.pack(side=BOTTOM, fill=X)
54
55 self.DBName = Label(self.root,
56 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 knjiga = str(self.b.get())
85 self.b.delete(0, END)
86 upit = '''DELETE FROM Knjige WHERE Knjiga ="{}"'''.format(knjiga)
87 self.cursor.execute(upit)
88 self.connection.commit()
89 self.Obavijest("Knjiga '{}' izbrisana!".format(knjiga), 'green')
90
91 def NovaBaza(self):
92 answer = simpledialog.askstring("Input", "Ime baze (.db format)",
93 parent=self.root)
94
95 if answer is None: return # ako nista korisnik ne unese
96
97 # neispravno ime za bazu
98 if answer[-3:] != '.db':
99 self.Obavijest('Krivi format imena baze!', 'red')
100 return
101
102 # ako je ispravno ime za bazu
103 # zatvaramo inicijalnu bazu
104 self.connection.commit()
105 self.connection.close()
106 self.cursor = ''
107
108 # otvaramo novu
109 self.connection = connect(answer)
110 self.cursor = self.connection.cursor()
111 self.Obavijest('Nova baza napravljena!', 'green')
112 self.StvoriTablicu()
113 self.DBName.configure(text=('Trenutna baza podataka: ' + os.path.dirname(__file__) + '/' + answer))
114 self.UÄitajIzBaze()
115
116 def UÄitajBazu(self):
117
118 fname = askopenfilename(filetypes=[('Datoteke SQL', '*.db')], title='Odaberi datoteku')
119
120 if len(fname) == 0: return # ako nista korisnik ne unese
121
122 # zatvaramo inicijalnu bazu
123 self.connection.commit()
124 self.connection.close()
125 self.cursor = ''
126
127 # otvaramo novu
128 self.connection = connect(fname)
129 self.cursor = self.connection.cursor()
130 self.Obavijest('Nova baza uÄitana!', 'green')
131 self.DBName.configure(text=('Trenutna baza podataka: ' + fname))
132 self.UÄitajIzBaze()
133
134 def Kraj(self, e=None):
135 self.connection.commit()
136 self.connection.close()
137 self.root.destroy()
138
139 def Obavijest(self, text, boja):
140 self.Labela.configure(text=text, bg=boja, fg='white')
141 self.root.update()
142
143 time.sleep(1.5)
144
145 self.Labela.configure(text='---', fg='black')
146 self.Labela['bg'] = Label(self.root)['bg']
147 self.root.update()
148
149 # ----------FUKCIJE ZA RAD S BAZOM-------------
150 def UnesiUBazu(self):
151 upit = 'INSERT INTO Knjige (Knjiga, Autor, Žanr, IzdavaÄkaKuća, GodinaIzdanja)\
152 VALUES ('
153
154 for entry in self.Entries:
155 upit += '"' + str(entry.get()) + '", '
156 entry.delete(0, END)
157
158 upit = upit[:-2] + ')'
159
160 # spremi u bazu
161 self.cursor.execute(upit)
162 self.connection.commit()
163 self.Obavijest('Nova knjiga unesena u bazu!', 'green')
164
165 def StvoriTablicu(self):
166 upit = '''CREATE TABLE IF NOT EXISTS Knjige (
167 Knjiga TEXT NOT NULL, \
168 Autor TEXT NOT NULL, \
169 Žanr TEXT NOT NULL, \
170 IzdavaÄkaKuća TEXT NOT NULL, \
171 GodinaIzdanja TEXT NOT NULL)'''
172
173 self.cursor.execute(upit)
174 self.connection.commit()
175
176 def UÄitajIzBaze(self, sortedBy='Knjiga'):
177 upit = 'SELECT Knjiga, Autor, Žanr, IzdavaÄkaKuća, GodinaIzdanja \
178 FROM Knjige \
179 ORDER BY ' + sortedBy + ' ASC'
180
181 data = self.cursor.execute(upit)
182 data = self.ObraditPodatke(data)
183 self.T.delete('1.0', END)
184 self.T.insert(0.0, data)
185 self.Obavijest('UÄitana tablica -> sortirano po: ' + sortedBy, 'green')
186
187 def ObraditPodatke(self, data):
188 stringData = '-' * 135 + '\n'
189 stringData += '| {}| {}| {}| {}| {}|'.format('Knjiga' + (' ' * 19), 'Autor' + (' ' * 20), \
190 'Žanr' + (' ' * 21), 'IzdavaÄkaKuća' + (' ' * 12),
191 'GodinaIzdanja' + (' ' * 12)) + '\n'
192 stringData += '-' * 135
193
194 for row in data:
195 stringData += '\n| '
196 for cell in row:
197 cell_str = str(cell) + (25 - len(str(cell))) * ' ' + '| '
198 stringData += cell_str
199
200 stringData += '\n'
201
202 return stringData
203
204
205if __name__ == '__main__':
206 # prvo uspstavljamo komunikaciju s bazom
207 conn = connect('inital_datebase.db')
208 cursor = conn.cursor()
209
210 # otvaramo suÄelje
211 e = Editor(Tk(), cursor, conn)