TL;DR: Pierwsze czyszczenie kodu. A może przynajmniej trochę bardziej intuicyjne nazewnictwo. Mamy całą listę zasad co to wyglądu kodu, którą najpewniej powinno się całą przeanalizować i stosować. My jednak zaczniemy starym zwyczajem od postaw.
Dobrze wiedzieć, że dobre IDE zrobi większość roboty za ciebie. Zamiast studiować księgi PEB 8, taki PyCharm, którego polecam, podkreśli co mu się nie będzie podobać i podpowie jakby to widział. To pierwszy krok do przejrzystego kodu.
Jednak pojawia się pytanie. Jakie nazwy stosować? Jakie są zasady nazewnictwa zmiennych czy klas? Oto podstawy podstaw:
- Nie używamy nazewnictwa jednoliterowego typu I lub l albo 1, O czy 0 czyli bardzo podobnych do siebie znaków, które będą w niektórych czcionkach wręcz nieodróżnialne.
- Nazwy pakietów i modułów powinny być krótkie i jednowyrazowe
- Nazwy klas powinny być w konwencji CapWords
- Nazwy funkcji piszemy małymi literami ewentualnie dodajemy podkreślenie czyli nazwa lub nazwa_funkcji
- Nazwy zmiennych piszemy na tej samej zasadzie co funkcje
Lepiej sensownie niż krótko
Ważne jest również żeby nazwy możliwie jak najbardziej odzwierciedlały swoje użycie. Szczerze mówiąc sprawia mi to nieco problemów, żeby na poczekaniu wynaleźć dobrą, krótką nazwę zawierającą sens danej funkcji czy zmiennej, ale widzę, że warto pogłówkować, bo potem o wiele łatwiej po czasie ogarnąć to co się napisało.
Czasem poprawki nie są drastyczne, ale mocno zmieniają czytelność na plus. Dajmy na to:
bttn = [] numbers="HMS789456123C0:" i = 0 for j in range(1,6): for k in range(3): bttn.append(Button(rightFrame, text = numbers[i], font ="Helvetica 15 bold", height = 1, width = 2)) bttn[i].grid(row = j, column = k, pady = 2, padx = 2) bttn[i]["command"] = lambda x = numbers[i]: num_press(x) i += 1
a to:
keyboard = [] keys = "HMS789456123C0:" i = 0 for j in range(1, 6): for k in range(3): keyboard.append(Button(rightFrame, text=keys[i], font="Helvetica 15 bold", height=1, width=2)) keyboard[i].grid(row=j, column=k, pady=2, padx=2) keyboard[i]["command"] = lambda x=keys[i]: num_press(x) i += 1
Niby można domyślić się, że bttn to skrót od button a numbers to numery na tych przyciskach, ale po co utrudniać i komplikować. Nazwy nie muszą być oryginalne, mają być sensowne i czytelne.
Wcześniej miałem coś takiego jak listone oraz sb1 czyli listbox pierwszy i scrollbar do niego. Już lepiej, żeby nazwy były dłuższe, ale czytelniejsze entries_list oraz entries_list_scrollbar.
Więcej informacji
Dobrze też ułatwić czytanie kodu przez wprowadzenie w nazwie nieco więcej informacji. Zamiast status mam teraz bottom_status_total dzięki czemu wiem, że dotyczy to statusu na dole okna, który sumuje wszystkie wprowadzone dane przez użytkownika.
To nie jest żmudne
Zmiana nazw z dobrym IDE nie jest ani trudna, ani problematyczna. Nie próbuj czasami zmieniać nazw ręcznie, bo więcej niż pewne, że zapomnisz tego zrobić w którejś linice i cały kod się wysypie.
W PyCharm wystarczy, że klikniesz w nazwę, którą chcesz zmienić, żeby ją zaznaczyć, klikasz prawym przyciskiem myszy, Refactor, Rename i magicznie zmiany są wprowadzone jednocześnie we wszystkich miejscach w których jest odwołanie to tej funkcji, zmiennej czy klasy.
Tak wygląda kod po pierwszych poprawkach. Sensowniej? Przynajmniej jest już czytelniejszy dla innych.
Masz jakieś rady lub uwagi? Daj znać w komentarzu. Newbie here.
from tkinter import * entries = [] total_info = "" def add_entry(evt): # For calculation button global total_info, entries entry = top_frame_input.get() entry = entry.replace("+", "") try: int(entry) # entries_list.insert(0,entry) entries.append(int(entry)) total_info = "Total: " + str(sum(entries)) status.set(total_info) entries_update() top_frame_input.delete(0, END) except: top_frame_input.focus() def clear_all(evt): # clear top_frame_input top_frame_input.delete(0, END) top_frame_input.focus() def clear_one(evt): # clear last digit from top_frame_input entry = top_frame_input.get()[:-1] top_frame_input.delete(0, END) top_frame_input.insert(0, entry) def num_press(num): # num pad button action if num == "C": clear_all("C") elif num == ",": # yeah, I found it quite useful for my keyboard top_frame_input.insert(END, ".") else: top_frame_input.insert(END, num) top_frame_input.focus() def entries_update(): entries_list.delete(0, END) for ti in entries: entries_list.insert(0, ti) # =======tkinter window=========== win = Tk() # win.geometry("775x325") # Force window size win.wm_title("Tacho 0.0.2") win.resizable(width=FALSE, height=FALSE) topFrame = Frame(win) # topFrame.pack(fill=BOTH) topFrame.grid(row=0, column=0, columnspan=2) rightFrame = Frame(win) rightFrame.grid(row=1, column=1) leftFrame = Frame(win) # middleFrame.pack(fill=BOTH) leftFrame.grid(row=1, column=0) bottomFrame = Frame(win) bottomFrame.grid(row=2, columnspan=2) # -------keys actions----- win.bind("<Return>", add_entry) win.bind("<KP_Enter>", add_entry) win.bind("<KP_Add>", add_entry) # ==========input entry=========== top_frame_input = Entry(topFrame, textvariable=StringVar(), font="Helvetica 20 bold", width=18, justify=RIGHT) top_frame_input.grid(column=8) # top_frame_input.pack(fill=X, expand=True, side=RIGHT, ipady=10) top_frame_input.bind('<Button-1>', clear_all) top_frame_input.focus() # ======top icons========== top_frame_icons = [] for i in range(0, 7): top_frame_icons.append( Button(topFrame, text='X', font="Helvetica 15 bold", height=1, width=2) ) top_frame_icons[i].grid(row=0, column=i) # ===========Listbox with scrollbar================= entries_list = Listbox(leftFrame, exportselection=0, height=15, width=40) entries_list.pack(side=LEFT, fill=BOTH, expand=True) entries_list_scrollbar = Scrollbar(leftFrame, orient=VERTICAL) # scrollbar entries_list_scrollbar.pack(side=LEFT, fill=BOTH) entries_list_scrollbar.configure(command=entries_list.yview) entries_list.configure(yscrollcommand=entries_list_scrollbar.set) # =======num pad========== keyboard = [] keys = "HMS789456123C0:" i = 0 for j in range(1, 6): for k in range(3): keyboard.append(Button(rightFrame, text=keys[i], font="Helvetica 15 bold", height=1, width=2)) keyboard[i].grid(row=j, column=k, pady=2, padx=2) keyboard[i]["command"] = lambda x=keys[i]: num_press(x) i += 1 # --------other buttons--------- add_entry_button = Button(rightFrame, text="+", font="Helvetica 15 bold", height=6, width=7) add_entry_button.grid(row=1, column=4, rowspan=4, columnspan=2, pady=2, padx=2) add_entry_button.bind('<Button-1>', add_entry) clear_one_button = Button(rightFrame, text="←", font="Helvetica 15 bold", height=1, width=2) clear_one_button.grid(row=5, column=4, pady=2, padx=2) clear_one_button.bind('<Button-1>', clear_one) modulo_button = Button(rightFrame, text="M24", font="Helvetica 15 bold", height=1, width=2) modulo_button.grid(row=5, column=5, pady=2, padx=2) modulo_button.bind('<Button-1>', add_entry) # =====bottom status============= status = StringVar() bottom_status_total = Label(bottomFrame, textvariable=status, bd=1, relief=SUNKEN, font="Helvetica 15 bold", width=54) status.set(total_info) bottom_status_total.pack(fill=X, expand=True, side=TOP, ipady=10, ipadx=10) # ============================================ win.mainloop()
Ogólnie to lepiej nie używać zmiennych global w pythonie – mogą zasłaniać potem inne zmienne, które chcesz nazwać tak samo i nie wiadomo co się dzieje.
PolubieniePolubione przez 1 osoba
Chyba nawet nie tylko w Pythonie. Jak mamy zmienną, i robimy inną o takiej samej nazwie, w jakimś wewnętrznym zasięgu to jak dla mnie zawsze robi się kipisz:]
PolubieniePolubienie
Tak, ale w Pythonie jest dodatkowy ból, że zmienne globalne możesz definiować wszędzie (np w ciele metody) i nigdy nie wiadomo co się z nimi stanie. W cpp na przykład jest szansa że te globale będą w jednym miejscu, co nieco ułatwi debuggowanie.
PolubieniePolubienie
z tego co widzę, masz tylko jeden scrollbar, więc czemu go nie nazwać po prostu scrollbar?
PolubieniePolubienie
Słuszna uwaga. W przyszłości będzie więcej obiektów i pewnie więcej scrollbarów więc tak trochę na przyszłość.
PolubieniePolubienie
Wyrzuć jeszcze to paskudne import * i będzie git 😉
PolubieniePolubienie
a jak powinienem zrobić import tkintera?
PolubieniePolubienie