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