Vinnaren i pepparkakshustävlingen!
2018-07-07, 00:26
  #1
Medlem
Hej!
Min skript börjar växa. Förmodligen kommer programmet att användas av mina kollegor. Det finns ganska mycket att konfigurera för olika ändamål. Någon GUI har jag aldrig gjort tidigare. För att slippa lära mig GUI men ändå prova göra programmet användarbar för mindre tekniska kollegor är alternativet då göra inställningar i Excel dokument. Då kan dom konfigurera i Excel som dom är bättre bekanta med.

Det är tänkt att inställningar har några kategorier. Olika kategorier kommer att separeras med olika blad i en excel fil. Varje blad kommer att skiljas sig från varandra i mängden av kolumner.

Problemet är inte att läsa och använda inställningar. Jag skriver en klass för varje blad. Däremot ifall jag ändrar kolumnmängden nån gång i framtiden då blir det lite jobbigt. Jag vet inte hur man skriver en flexibel kod i detta fall. Har ni några idér? Det känns som att jag gräver min egen grav här.


Bild med inställningar: https://imgur.com/a/WA3ni0g
Exempel på en klass som läser key-value i ett Excel blad: https://pastebin.com/upFmZA5P
Citera
2018-07-07, 06:39
  #2
Medlem
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.
__________________
Senast redigerad av JagHarIngaKompisar 2018-07-07 kl. 06:58.
Citera
2018-07-08, 14:08
  #3
Medlem
Tack för en detaljerad svar angående GUI, JagHarIngaKompisar!
Men tyvärr har jag ina planer att sätta mig in i det just nu. Men kanske i framtiden. Jag förmodligen återkommer till denna post när det blir aktuellt.
Citera
2018-07-08, 17:01
  #4
Medlem
Skriv in ett versionsnummer för varje blad som du använder, och ifall du lägger till något i framtiden kan du hålla koll på det genom detta.
Citera
2018-07-08, 19:19
  #5
Medlem
Citat:
Ursprungligen postat av Gottisborgen
Skriv in ett versionsnummer för varje blad som du använder, och ifall du lägger till något i framtiden kan du hålla koll på det genom detta.

Det hade jag inte tänkt på. Tack
Citera
2018-07-09, 18:20
  #6
Medlem
Citat:
Ursprungligen postat av ragnar11
Tack för en detaljerad svar angående GUI, JagHarIngaKompisar!
Men tyvärr har jag ina planer att sätta mig in i det just nu. Men kanske i framtiden. Jag förmodligen återkommer till denna post när det blir aktuellt.

Alright!

Tycker nog att konfigurationsfiler i Excelformat skulle vara lika irriterande som en README-fil i Wordpadformat om jag laddade hem ett program.

Skapa och hålla ordning på en mappstruktur, flytta/kopiera INI-filer mellan mapparna, samt radera och redigera dem kan alla datoranvändare göra.

Om inställningarna är så avancerade, jag kanske missförstod. En enda fil med tre namngivna sektioner kanske räcker.

Sen kan du väl programmera ett Excel-ark som en bonus, och låta det spara ner som INI. Eller skriva en konverterare i Python som läser Excelformatet och sparar i INI-formatet.
Linux and Unix systems also use a similar file format for system configuration. In addition, platform-agnostic software may use this file format for configuration. It is human-readable and simple to parse, so it is a usable format for configuration files that do not require much greater complexity.

For example, the platform-agnostic PHP uses the INI format for its "php.ini" configuration file in both Windows and Linux systems.
-- https://en.wikipedia.org/wiki/INI_file
__________________
Senast redigerad av JagHarIngaKompisar 2018-07-09 kl. 18:32.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback