@XarrrdaS: Tak samo walczę z podświetleniem przycisków podczas najechania na nie, oto co wykombinowałem(ostatnia funkcja).Generalnie to działa, lecz podczas najechania na jaki kolwiek przycisk od razu konsola zwraca błąd: TypeError: 'Event' object does not support item assignment i również nie rozumiem co on oznacza. Z góry dziękuję za pomoc.
import tkinter
from tkinter import *
symbole = ['7', '8', '9', '/', '\u21BA', 'C', '4', '5', '6', '*', '(', ')', '1', '2', '3', '-', 'x^2', '\u221A', '0',
',', '%', '+']
COLOR = '#36393E'
def inicjalizacjaOkienka():
root = tkinter.Tk()
root.geometry('466x500')
root.resizable(0, 0)
root.title('Kalkulator')
root.configure(bg=COLOR)
return root
def inicjalizacjaEkranu(root):
ekran = [tkinter.Label(root, bg='#C0CBCB',width=65, anchor='w', borderwidth=2) for i in range(3)]
for i in range(len(ekran)):
ekran[i].grid(row=i, columnspan=6, ipady=15, ipadx=1)
return ekran
def inicjalizacjaPolaNaDane(root, ekran):
pole_na_dane = tkinter.Entry(root, borderwidth=0, highlightcolor='white', highlightbackground='white')
pole_na_dane.grid(row=len(ekran), columnspan=6, ipadx=171, ipady=10)
info = tkinter.Label(root, bg='white', width=65, anchor='w', borderwidth=2)
info.grid(row=len(ekran) + 1, columnspan=6, ipady=15, ipadx=1)
return pole_na_dane, info
def inicjalizacjaPrzycisków(root, ekran, info):
# buttonborder = tkinter.Frame(highlightbackground="black",
# highlightthickness=.5, bd=0)
# Border = LabelFrame(root, bd=1, bg="black", relief=FLAT)
# Border.grid(padx=10, pady=10)
przyciski = [tkinter.Button(root,text=symbol, bg=COLOR, borderwidth=1, activebackground='#9FA2A2')
for symbol in symbole]
j = len(ekran) + 2
for i in range(len(przyciski)):
if i % 6 == 0:
j += 1
# margines = 20 if len(symbole[i]) == 1 else 10
przyciski[i].grid(row=j, column=i % 6, pady=5, padx=5, ipady=15, sticky="ew")
przyciski[i].configure(command=przyciskKlik(pole_na_dane, przyciski[i]['text']))
znak_rownosc = tkinter.Button(root, text='=', bg='#B5A519', borderwidth=0, command=oblicz(pole_na_dane, ekran, info))
znak_rownosc.grid(row=len(ekran) + 6, column=4, columnspan=2, pady=5, padx=5, ipady=15, sticky="ew")
return przyciski
def przyciskKlik(pole_na_dane, symbol):
def f():
if symbol == '\u21BA':
tekst = pole_na_dane.get()[:-1]
pole_na_dane.delete(0, tkinter.END)
pole_na_dane.insert(tkinter.END, tekst)
elif symbol == 'C':
pole_na_dane.delete(0, tkinter.END)
else:
text = symbol if symbol != 'x^2' else '^2'
pole_na_dane.insert(tkinter.END, text)
return f
def oblicz(pole_na_dane, ekran, info):
def czyPoprawnyOstatniZnak(tekst):
i = 1
while tekst[-i] == ')':
i += 1
return tekst[-i].isdigit()
def czyWielokrotneOperatory(tekst):
for i in range(len(tekst)):
if not tekst[i].isdigit() and not tekst[i + 1].isdigit():
return True
return False
def zamienZnakPotegi(tekst):
for i in range(len(tekst)):
if tekst[i] == '^':
tekst = tekst[:i] + '**' + tekst[i + 1:]
return tekst
# def zamienZnakPierwiastka(tekst):
# for i in range(len(tekst)):
# if tekst[i] == '\u221A':
# tekst = tekst[:i] + str(math.sqrt(i)) + tekst[i + 1:]
# return tekst
def f():
tekst = pole_na_dane.get()
if not czyPoprawnyOstatniZnak(tekst) or czyWielokrotneOperatory(tekst):
info['text'] = 'Błędne wyrażenie!'
else:
for i in range(1, len(ekran)):
if ekran[i]['text']:
ekran[i - 1]['text'] = ekran[i]['text']
if '^' in tekst:
wyrazenie = zamienZnakPotegi(tekst)
ekran[-1]['text'] = tekst + ' = ' + str(eval(wyrazenie))
# if '\u221A' in tekst:
# wyrazenie2 = zamienZnakPierwiastka(tekst)
# ekran[1]['text'] = tekst + ' = ' + str(eval(wyrazenie2))
else:
ekran[-1]['text'] = tekst + ' = ' + str(eval(tekst))
return f
def podswietlenie(przyciski):
def on_enter(przyciski):
przyciski['background'] = 'green'
def on_leave(przyciski):
przyciski['background'] = '#B5A519'
for i in przyciski:
i.bind("<Enter>", on_enter)
i.bind("<Leave>", on_leave)
if __name__ == '__main__':
root = inicjalizacjaOkienka()
ekran = inicjalizacjaEkranu(root)
pole_na_dane, info = inicjalizacjaPolaNaDane(root, ekran)
przyciski = inicjalizacjaPrzycisków(root, ekran, info)
podswietlenie = podswietlenie(przyciski)
root.mainloop()