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