TL;DR: Tkinter jako GUI. Mamy okno, przyciski i pierwsze funkcje.

Trochę przerażające jest dla początkującego otworzyć IDE i zobaczyć pustkę zarówno projektu jak i swojej niewiedzy.

Rok temu zaraz po kursie Pythona napisałem swój pierwszy program. Był to Kuchenny Przelicznik Wag.

Dopóki jeszcze nie wiem jak bardzo powinienem się wstydzić jego kodu można go znaleźć tutaj. Postanowiłem użyć go jako dawcę części. Tak było prościej przebrnąć przez te pierwsze kody.

Co my tu mamy?

Postanowiłem wykorzystać Tkinter jako GUI, bo podobno jest dość proste a na prostotę na początku wolę postawić.

Numpad to największy feature, który został przeszczepiony z Przelicznika. Reszta myślę, że jest dość oczywista, zresztą niewiele ten program na razie robi więc nie będziemy się nad nim więcej pastwić.

tacho1


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

Zamiast wypisywania każdego przycisku z osobna mamy tu loop, która rysuje przyciski w 3 kolumnach [for k in range(3)] i 5 rzędach [for j in range(1,6)].

Listę przycisków bierze z numbers=”HMS789456123C0:” przy okazji zarówno wstawia napis na przycisk jak i daje mu taką samą funkcję.

Kod jest na razie straszny pod względem nazewnictwa oraz PEP 8 o którego istnieniu dopiero się dowiedziałem. Tym się zajmę w następnej kolejności.

Ważne, że pierwsze kroki zostały poczynione. Niechaj to trwa. Prace na razie idą szybciej niż pisanie postów, więc zawsze można zerknąć co aktualnie namieszałem.

Jeśli masz jakiś pomysł lub uwagii, wrzuć komentarz. Dzięki.


# Panie wężu proszę o program do tacho
# -*- encoding: utf8 -*-
from tkinter import *
timeEntries = []
info = ""
def calc(evt): #For calculation button
    global info, timeEntries
    entry = entry_field.get()
    entry = entry.replace("+","")

    try:
        int(entry)
        #list_one.insert(0,entry)
        timeEntries_update()
        timeEntries.append(int(entry))
        info = "Total: " + str(sum(timeEntries))
        stat.set(info)
        entry_field.delete(0, END)

    except:
        #entry_field.delete(0, END)
        entry_field.focus()

def clearbox(evt): # clear entry box
    entry_field.delete(0, END)
    entry_field.focus()

def clearone(evt):
    entry = entry_field.get()[:-1]
    entry_field.delete(0, END)
    entry_field.insert(0,entry)

def num_press(num):
        if num == "C":
            clearbox("C")
        elif num == ",": # yeah, I found it quite usefull for my keyboard
            entry_field.insert(END, ".")
        else:

            entry_field.insert(END, num)
            entry_field.focus()

def timeEntries_update():
    for i in timeEntries:
        list_one.insert(0,i)

#=======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=1, columnspan=2)

rightFrame = Frame(win)
rightFrame.grid(row=1, column=1) # This puts item on place

leftFrame = Frame(win)
#middleFrame.pack(fill=BOTH)
leftFrame.grid(row=1, column=0)

downFrame = Frame(win)
downFrame.grid(row=2, columnspan=2)

entry_field = Entry(topFrame, textvariable=StringVar(), font ="Helvetica 20 bold", width=18, justify=RIGHT)
#entry_field.grid(sticky=E)
entry_field.pack(fill=X, expand=True, side=RIGHT, ipady=10)
entry_field.bind('<Button-1>', clearbox)
entry_field.focus()

#-------set what happens if you press Enter-----
win.bind("<Return>", calc)
win.bind("<KP_Enter>", calc)
win.bind("<KP_Add>", calc)

#=========================================

list_one = Listbox(leftFrame, exportselection=0, height=15, width=40)
list_one.pack(side=LEFT, fill=BOTH, expand=True)

sb1 = Scrollbar(leftFrame, orient=VERTICAL) #scrollbar
sb1.pack(side=LEFT,fill=BOTH)

sb1.configure(command=list_one.yview)
list_one.configure(yscrollcommand=sb1.set)

# lb1.bind('<<ListboxSelect>>', firstselect) #action for selected line

stat = StringVar()
status = Label(downFrame, textvariable=stat, bd=1, relief=SUNKEN, font = "Helvetica 15 bold",width=54)
stat.set(info)
status.pack(fill=X, expand=True, side=TOP, ipady=10, ipadx=10)

#=======Numpad==========
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

#other buttons

cbutton = Button(rightFrame, text ="+", font ="Helvetica 15 bold", height = 6, width = 7)
cbutton.grid(row = 1, column = 4, rowspan = 4, columnspan=2, pady = 2, padx=2)
cbutton.bind('<Button-1>', calc)

otherbutton = Button(rightFrame, text ="←", font ="Helvetica 15 bold", height = 1, width = 2)
otherbutton.grid(row = 5, column = 4, pady = 2, padx=2)
otherbutton.bind('<Button-1>', clearone)

modulobutton = Button(rightFrame, text ="M24", font ="Helvetica 15 bold", height = 1, width = 2)
modulobutton.grid(row = 5, column = 5, pady = 2, padx=2)
modulobutton.bind('<Button-1>', calc)



#============================================

win.mainloop()

7 uwag do wpisu “Pierwsze kody za płoty

  1. Mam trochę doświadczenia w budowaniu GUI za pomocą Tkintera i polecam Python Mega Widgets (http://pmw.sourceforge.net/) – biblioteka oparta na Tkinterze, ale zawierająca zestaw widgetów będących połączeniami kilku widgetów Tkinterowych. Bardzo przyspiesza pracę, pozwala na budowanie ładniejszych interfejsów przy mniejszej frustracji, no a generalnie zasada działania jest ta sama (tzn jeżeli umiesz Tkinter, to umiesz Pmw). Pozdrawiam!

    Polubione przez 1 osoba

    1. Hej. Wracam po przerwie. Przejrzałem PMW i muszę przyznać, że wygląda super. Będę teraz próbować to przetrawić. Zastanawiam się tylko czy na tak początkującym etapie dobrze jest korzystać z tego typu rozwiązań oraz jak prowadzić dokumentację, żeby w przyszłości się w tym połapać oraz umożliwić innym sprawdzanie, rozwijanie czy używanie mojego kodu. Pozdrawiam!

      Polubienie

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google

Komentujesz korzystając z konta Google. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s