Tervehdys,
löytyisikö apua alla kuvattuun ohjelmointiongelmaan:
Yritän tehdä visuaalista esitystä for loopilla luoduille label + entry ryhmille 3:ssa ryhmässä, jossa erilainen entry ikkunan taustaväri osoittaa aineistossa esiintyvien tapausten/merkitysten määrän koko aineistosta.
Asetelma on tuttu ohjelmointiharjoitusten username, password asetelmista, jossa labelli edeltää entry ikkunaa, johon voi kirjoittaa nimensä ja salasanansa ja isompia kokonaisuuksia voi luoda for loopilla.
Sovelluksessa näitä labelli+ entry olisi kolme ryhmää, joissa on 5, 10, 10 label+entry paria kussakin ja niihin ei kirjoiteta mitään.
For loopilla luodaan kolme ryhmää, joista yksi on tässä malliksi:
r = 0 for i in dms1: labs1 = tk.Label(self.frm_top, text=i, relief='ridge', width=15) labs1.grid(row=r,column=0) ents1 = tk.Entry(self.frm_top, width=15) ents1.grid(row=r,column=1) ents1.configure(bg='black', relief='sunken', borderwidth=2) r = r + 1
Listoissa dms1-3 on labelleihin tulevat nimet.
Sanakirjatiedostoon päivittyy kunkin avain-arvo parin osalta kyseisen avaimen frekvenssi.
Sanakirjatiedosto on muotoa y = {key: x, {’frequency’: 0, ’meaning’: ’xxxx’}
Labelli+entry esityksissä kuvataan siis merkityksen nimi ja entry ikkunan erilaisella taustavärillä osoitetaan, mitkä merkityksistä esiintyivät kun frekvenssi>0.
Tähän saakka asiaa on pähkäilty pari päivää ja tässä olisi koodiyritlelmä asian ratkaisemiseksi. Listassa y1 on kaikkien käytettyjen labellien/merkitysten nimet
markers_updated = {key:value for (key,value) in y.items() if value['frequency']>0 and value['meaning'] in y1} markers = {} y3 = [] for (key,value) in markers_updated.items(): if value['frequency']>0 and value['meaning'] in y1: markers[key] = value if value['meaning'] not in y3: y3.append(value['meaning']) #number_of_markers = len(y3)
Ongelma on tässä kohtaa koodia: eli miten saada muutettua niiden entry-ikkunoiden taustaväriä, joissa frekvenssi>0 siten, että alkuperäinen for loopilla tehty rakenne on mahdollinen säilyttää, jos se ylipäätään on mahdollista, tai tehdä asia jotenkin toisin:
for i in y3: if i in dms1: ents1.configure(bg='gray50')
Alkuperäisessä sanakirjatiedostossa on useita eri avaimia, joilla on sama merkitys. Sen esitystapa/rakenne ei liene paras mahdollinen.
Tervehdys,
tässä on näköjään tullut virhe kirjoittettaessa:
Sanakirjatiedosto on muotoa y = {key: x, {’frequency’: 0, ’meaning’: ’xxxx’}.
Oikea muoto on tietenkin:
Sanakirjatiedosto on muotoa y = {key: {’frequency’: 0, ’meaning’: ’xxxx’},
jossa avaimella on arvoina frekvenssi ja meaning.
Luin viestisi ja koodisi pari kertaa, ja en saa ihan selvää asiastasi. Ilmeisesti ongelma on kuitenkin se, että et tallenna widgettejä (ainakaan tuossa koodissa) ja siksi et pysty muokkaamaan niitä myöhemmin. Eli ratkaisu on loogisesti se, että tallennat widgetit vaikka sanakirjaan jollain avaimella, jonka perusteella pystyt myöhemmin hakemaan ne muokkausta varten.
Muuttujia voisit ylipäänsä nimetä selvemmin, nimittäin labs1 ja ents1 eivät kerro mitään ja ilmeisesti numerolla ei ole niissä edes merkitystä, kun niitä kerran käsitellään silmukan sisällä. Käytän esimerkissä kuitenkin samoja nimiä, jotta saat sovellettua esimerkkiä paremmin.
widgetit = dict() # Luomisen yhteydessä: widgetit[avain] = (labs1, ents1) # Myöhemmin: labs1, ents1 = widgetit[avain] ents1.configure(bg = 'gray50')
P.S. Koeta ensi kerralla viestiä kirjoittaessasi saada kooditagit kohdalleen – käyttöohjeet ovat erittäin yksinkertaiset!
Tervehdys,
kiitoksia vastauksesta.
Pikaisena kommenttina se, että muuttujat labs1-3 tarkoittavat labelleja ryhmille 1-3, joissa taas on vastaavat entry-ikkunat ent1-3.
Foor loopilla luodut 3 ryhmää näkyvät kyllä top-leve ikkunassa oikein. Numero viittaa vain kolmeen ryhmään labelli+entry osiota, kun niitä ei haluttu tehdä yhteen palstaan, jossa olisi 25 riviä alekkain.
Eli muuttujat ovat koodin alussa luodut labs1 ja ent1 ensimmäiselle ryhmälle.
ma08 kirjoitti:
Eli muuttujat ovat koodin alussa luodut labs1 ja ent1 ensimmäiselle ryhmälle.
Mutta näet kai itsekin, että for-silmukassa joka kierroksella labs1 ja ents1 asetetaan uudestaan, eli jos dms1 sisältää vaikka 5 asiaa, luot 5 kpl labeleita ja entryjä mutta labs1 ja ents1 sisältävät lopuksi vain viimeisen luodun asian.
Tervehdys,
kiistos vastauksesta.
Sain tehtyä haluamani entri-widgettien taustavärin muutokset tekemällä erlliset entry muuttujat jokaiselle ensin kuvatun for loopin tekemälle labellille ja näihin ikkunoihin haluamani värit 25:llä if lausella, jossa kussakin oli annettu tarkka merkitys. Tämä on tietysti köykäinen toteutus, mutta koodi toimii sinänsä halutulla tavalla.
Jossain toisessa ohjelmassa sain muistaakseni poistettua erilliset if-lauseet käyttämällä sublist-järjestelyä ja for looppia sille, jossa kukin merkitys oli omassa sublistassaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.