Citat:
Ursprungligen postat av
ragnar11
Någon GUI har jag aldrig gjort tidigare.
Då kan jag rekommendera det, det är lika enkelt som roligt. Grunderna i Tkinter lär jag min morfar på kortare tid än det tar att läsa det här inlägget, och
här finns en referens med detaljerna. Jag programmerar inte Python men kan sammanfatta hur det fungerar i Tcl:
Man kör GUI-script med programmet wish.exe, istället för tclsh.exe för de vanliga konsollscripten. Det skapar automatiskt ett huvudfönster innan scriptet börjar att köras, och går automatiskt in i event-loopen när scriptet är slut (EOF). Istället för att avsluta som tclsh.exe gör.
Mellan det, alltså i scriptet, skapar man widgets, en per funktionsanrop, där de vanligaste argumenten förutom namn och typ är vilken variabel som en kryssruta, grupp med radioknappar eller ett textfält ska vara automatiskt kopplat till (tvåvägs) eller vilken funktion som ska anropas när man klickar på en knapp. Och placerar dem med lämplig
geometry manager: pack, grid eller place, vilket man kan göra på en gång i samma anrop.
Och skriver funktionerna såklart. All kod som körs utöver detta är den i dina funktioner, som anropas från event-loopen och returnerar till den efteråt, tills någon kör exit() eller stänger ".". De kan t.ex. triggas av en engångs- eller upprepad timer som du startar med funktionen after(), klickandet på en knapp eller stängandet av ett särskilt fönster. Eller varför inte vid modifiering av en variabel som du sätter en trace på.
Det skapade root-fönstret heter "." (punkt) och man placerar widgets i hierarkin genom att helt enkelt döpa dem vid skapandet, exempelvis ".shoppingcart.payment.method" för en radioknapp i ramen för betalning i fönstret för varukorgen. Alla andra öppnade fönster blir barn till root-fönstret.
Grafiska uppdateringar sker inte på skärmen förrän du kommer in i event loopen eller tillbaka till den igen, så du kan skapa fler fönster i det initiala skedet eller t.o.m. dölja root-fönstret och få ett osynligt program, kanske kombinerat med en liten trevlig ikon i Windows verktygsfält. Det går att anropa refresh() manuellt om det skulle behövas, men tanken är att inte loopa utan låta event-hanteraren sköta programflödet.
Kod:
package require Tk
pack [button .quit -text Quit -command exit]
Det tråkigaste jobbet är att pack:a (den vanligaste metoden, grid är för tabeller och place för exakt placering). Åtminstone om användaren själv ska kunna ändra fönstrets storlek, som i ett texteditorprogram. När då fler än en widget ligger på rad horisontellt eller vertikalt, lär man ankra/fästa deras kanter mot det fönster (eller innehållande widget, t.ex. en ram) som innehåller dem för att på så sätt välja vilken/vilka av dem som automatiskt ska ändra storlek tillsammans med fönstret/widgeten, om någon överhuvudtaget.
Men för ett enkelt konfigurationsfönster kan du skippa ankrandet, låta det vara sin default och bara sätta resizeable till false för fönstret. Det går fortfarande att ändra storleken programmatiskt vid behov.