EXTREMA TKINTER KNAPPAR!!! | Dev Blog #2 > WRITe #2

Bud bud abbul abbuw! ”Wubba lubba dub dub”, baklänges. Tredje Dev Bloggen, om man inkluderar #0!

Om ni minns förra Dev Bloggen (som bör ha lästs före du läser detta), så byggde vi programmets grunder. Vi valde först språk; Python. Vi använde oss sedan av TkInter, för att göra ett fönster och ett kalkylark. I dag, som jag lovade i Dev Blog #1, ska jag visa hur man gör TkInter knappar. En knapp som lägger till rader, en knapp som tar bort rader, och en knapp som sparar data.

Boken om Cirus och Lucas

Jag skriver för närvarande en bok, vid namn Boken om Cirus och Lucas. Det är en sci-fi-roman, som jag har skrivit 23 tusen ord på hittills. Målet är någonstans runt 75 tusen ord, men jag bryr mig inte direkt om det blir 70 eller 80. Förra Dev Bloggen sa jag att jag skulle berätta mer om boken detta inlägg, så här har ni ett utdrag från kapitel ett:

Cirus hade precis sprängt Jorden, och den ende som hade följt med honom var Människo-hanen Lucas från arten Homo sapiens.
”Du, Cirus”, frågade Lucas.
Mm.”
”Var … är jag? Och varför dricker du hela tiden?”
Den första frågan var en väldigt bra fråga att ställa, då Lucas inte visste var han befann sig för tillfället. Den andra frågan var dock en väldigt dålig fråga att fråga, då det var Cirus grej att dricka. Alla visste det.
”Du är här. Och att dricka är min grej, det vet du”, svarade Cirus.
Lucas visste mycket riktigt att det var Cirus grej att dricka, men frågade ändå. En av människosläktets många dåliga egenskaper. Det var ju givetvis Cirus grej att dricka (no shit, Lucas). För närvarandet drack han en 55-procentig, polsk vodka.

Herre Gud, Lucas! Alla vet att Cirus dricker! Det är ju i och för sig Cirus grej att dricka, Lucas. Nej, men det är i alla fall en seriös-ish-komedi-i-bland-bok. Det är en blandning av alla möjliga genrer och ideér.

WRITe

Tillbaka till ämnet: knappar. Detta är lite av en tutorial på hur man skapar TkInter knappar. Koden är dock kommenterad på engelska — fast allt annat är på svenska! Du kommer dessutom att lära dig ytterst lite om lambda funktioner i Python 3.x.

Korrigeringar

Först måste jag dock ändra lite på koden. Detta är en del av den gamla koden, som vi blev klara med förra Dev Bloggen:

Rad 38 (den nedre, markerade) har ingen anledning att ha en default-parameter, och den fungerar dessutom inte. lambda x: True if x is int else False betyder True om inputen är int… Förutom att den inte fungerar. x är en str, så det kommer alltid vara False. ( lambda-guider finns här, här, och till och med här! (Om du har tur finns det även här…)) Även om det hade fungerat, vilket den inte gör, så finns SimpleTableInput.Validate()-metoden:

Som alltid har varit där … och dessutom använts. Jag märkte inte att det var fel, då det som var fel inte användes. Yikes.

Ja, ja. Sånt händer. Den reviderade koden finns nedan:

Jag ber om ursäkt för detta. Dags för knappar!

Hur man skapar TkInter knappar!

Knappar. Det finns många sådana. Det finns stora, små, gula, lila, små och gula. Till och med små, gula och lila knappar finns!!! De vi kommer att skapa är dock inte gula eller lila. En knappar kommer att vara grön, en annan röd, och en vit.

Den gröna knappen kommer att lägga till rader, den röda ta bort rader, och den vita spar data.

Först och främst ska jag visa hur man skapar TkInter knappar. Vi använder oss av tkinter.Button-klassen för det.

Detta är en TkInter knapp, med texten ”Exempel”. När man trycker på den utförs exampelFunktion()-funktionen, som kan vara vad man vill. Den har även en bakgrundsfärg, grön, som defineras med bg-attributen

Först skapar vi våra knappar i App():s __init__(), och tkinter.pack():ar dem, så att de syns i mitten av skärmen:

Då får vi detta:

python 3xyvJDWxI7

Snyggt? Nej. Fult? Ja. Jag vet inte vad ni tycker, men det hade sett bättre ut i fall knapparna låg sida vid sida. Detta gör vi med tkinter.Frame() och tkinter.grid(). tkinter.grid() rätar upp widgets (det vill säga TkInter-objekt). Kalkylarket (rutorna, alltså), exempelvis, använder sig av tkinter.grid() — så att du vet hur det ser ut. Vi kommer att utnyttja ett sådant för att våra knappar ska se snygga ut. Först och främst måste vi skapa en tkinter.Frame() i App(), som vi kan lägga tktiner.grid():en i, som vi sedan kommer lägga knapparna i:

Vi tkinter.pack():ar den, så att den syns i fönstret över huvud taget. Grejen är den att, TkInter har tre inbyggda layouthanteringsmetoder: tkinter.grid(), tkinter.pack() och tkinter.place(). Man måste använda någon av dem för att en widget ska synas, annars är den inte med på skärmen. Nu har vi vår tkinter.Frame(). I denna måste vi lägga ett tkinter.grid(), som innehåller knapparna. Nu har vi detta:

De markerade raderna är knapparna, och raderna mellan knapparna tkinter.pack():ar knapparna. För att lägga in knapparna i buttonFrame, måste vi lägga till buttonFrame  som knapparnas parent:s. Vilket vi enkelt gör genom att sätta buttonFrame som master. self är master som default, men nu så vill vi ju inte det … för då blir jag ledsen ;(… Koden nu:

Om vi nu kör koden, så får vi detta:

python X50JnE9ICN

Bra, men vi har ett steg kvar. Som ni kan se, så är knapparna inte lika stora, vilket resulterar i att de inte är symmetriskt upplagda. Så, vi ändrar knapparnas width-attribut till ett värde. Detta värde, buttonWidth, sätter jag på 9. Det markerade är ändringarna:

TkInter knappar

Perfekt! Det var en pärs. Det var inte så komplicerat, men det var långdraget! Men, som du kanske märkt, så händer inget när man trycker på knapparna. Detta beror på att de inte har några funktioner länkade till dem.

Spara knappen

För att en knapp ska vara länkad till en funktion (eller rättare sagt en metod, då metoden existerar inuti SimpleTableInput(), en klass), så måste man först ha en metod. Spara knappen ska vara länkad till en metod som sparar data. För detta kommer vi använda en simpel .csv-fil. Jag kom fram till detta:

Det är relativt simpel kod, som går igenom alla rader. Den går sedan igenom alla dessa raders kolumner, och gör en list med radernas innehåll. Efter den har gått igenom alla rader, skriver den dem rad för rad till data.csv. Men, då vi ändå vet vilka rubrikerna är (på rad 1), så exkluderar vi rad 1 från filen, då de tar upp onödig plats. Eller rättare sagt, de är onödiga. Den platsen är nödig; det är upptagandet som är onödigt.

Men, vi behöver även kunna ladda denna sparfilen. Detta görs lätt, genom att lägga till inladdningen i SimpleTableInput.__init__(), så att den körs när programmet startas. Sådan kod hade kunnat se ut så här:

Det är relativt simpel kod, som går igenom alla rader. Den går sedan igenom alla dess raders kolumner, och gör en list med radernas innehåll. Efter den har gått igenom alla rader, anger den dem rad för rad i kalkylarket.

Sedan är det dags att ange command i Spara knappen:

command är nu self.table.save().

Schkablam!

Ny rad knappen

För att skapa en ny rad ska vi göra en metod i SimpleTableInpt(). En metod, som använder sig av SimpleTableInput.addEntry()-metoden. Vad funktionen ska göra är ohyggligt simpelt: den ska skapa en ny tkinter.Entry(), COLUMN (3) gånger. Sedan ökar den globala ROWS med 1, det vill säga antalet rader ökar med 1.

Och addRowButton:s command-attribut:

Det var lätt!

Radera rad knappen

Att radera en rad är som att lägga till en rad, fast baklänges. Alltså, i stället för att skapa en tkinter.Entry(), så använder vi tkinter.Entry():s destroy()-metod. Vi gör detta i en ny SimpleTableInput()-metod:

Perfekt!

Avslut

Vi har lärt oss hur man skapar TkInter knappar, och nu har vi gjort ett sparsystem, samt knappar som lägger till och raderar rader!

Här är den slutgiltiga koden:

PogChamp

Jag är i alla fall nöjd. Nästa gång kommer vi att implementera datumsystemet, det vill säga en inbyggd kalender … och sånt. Glöm inte att prenumerera på vårt nyhetsbrev, så att du aldrig missar ett inlägg! Glöm dessutom inte att all kod finns på min GitHub!

 

Tobbe out.

Lämna en kommentar

Din e-postadress kommer inte publiceras.