Moro
Olisiko apuja.
Ihan harrastuksen vuoksi opettelen Kivyä ja ohjelmointia, joten vääntäkää rautalangasta pliis :-)
Tämän testin tarkoituksena oli löytää helppo tapa muokata pythonen kautta kv widgettejä. Ja testinä on tällainen yksinkertainen kello.
Mutta en saa millään tuota self.text muuttujaa juttelemaan lopun ohjelman kanssa.
Jokin ihan perus juttu tässä on nyt ymmärretty väärin tai ei ole ymmärretty ollenkaan.
Se vielä sekoittaa, että jos tuota update metodia kutsuu init metodista, niin silloin ohjelma toimii kunnes ajastin yrittää kutsua updatea. Eli aivan kuin vika ei olisi muuttujien näkyvyydessä?
from kivy.app import App from kivy.lang import Builder from kivy.uix.label import Label from kivy.clock import Clock import time kv = ''' #:import aika time kelloLabel: id: koe ##text: aika.strftime('%H:%M:%S', aika.localtime()) ''' class kelloLabel(Label): def __init__(self, **kwargs): super(kelloLabel, self).__init__(**kwargs) self.text = time.strftime('%H:%M:%S', time.localtime()) #self.update() def update(self): print(time.strftime('%H:%M:%S', time.localtime())) #self.text = time.strftime('%H:%M:%S', time.localtime()) class Kokeilu2App(App): def build(self): Clock.schedule_interval(kelloLabel.update, 1) return Builder.load_string(kv) Kokeilu2App().run()
Vika on siinä, että annat schedule_interval
-funktiolle sitomattoman funktion. Sitomattomuus tarkoittaa, että funktiota, joka tarvitsee instanssin toimiakseen (ensimmäinen parametri self), kutsutaan ilman instanssia. Sinun täytyy ensin tehdä kelloLabel
-luokasta instanssi:
klabel = kelloLabel()
Nyt voit antaa tämän instanssin metodin parametriksi:
Clock.schedule_interval(klabel.update, 1)
Ps. Luokat kannattaa nimetä alkamaan isolla alkukirjaimella (https://www.python.org/dev/peps/pep-0008/#class-names).
Paljon kiitoksia vastauksesta.
Seuraava ongelma on se, että miten tuo klabel instanssi saadaan juttelemaan tuon yllä olevan kv rakenteen kanssa.
Tai siis, miten kerron kv:ssa, että haluan tämän klabel instanssin tähän kohtaan?
Kokeilin yksinkertaistaa tuota koodin pätkää, mutta tässä on sama ongelma.
from kivy.app import App from kivy.lang import Builder from kivy.uix.label import Label from kivy.clock import Clock import time from kivy.properties import StringProperty kv = ''' KelloLabel: id: koe text: self.aika ''' class KelloLabel(Label): aika = StringProperty() def update(self, x): print(time.strftime('%H:%M:%S', time.localtime())) self.aika = time.strftime('%H:%M:%S', time.localtime()) class Kokeilu2App(App): def build(self): klabel = KelloLabel() Clock.schedule_interval(klabel.update, 1) return Builder.load_string(kv) #return klabel Kokeilu2App().run()
Tuosta on logiikka hukassa. Mieti, millä rivillä luodaan uusia asioita ja mihin ne ohjelmassa päätyvät.
# Luot uuden olion: klabel = KelloLabel() # Käytät edellistä oliota: Clock.schedule_interval(klabel.update, 1) # Luot taas uuden olion: return Builder.load_string(kv)
Selvästi sinun pitäisi luoda vain yksi olio:
klabel = Builder.load_string(kv) Clock.schedule_interval(klabel.update, 1) return klabel
No sitä tässä on mietitty, että miten nuo saataisiin yhteen.
Olen tässä nyt 2 päivää yrittänyt lukea apia ja foorumeita ja google esimerkkejä, että miten pythonista muutetaan kv:n muuttujia. Kv:sta pythoniin onkin helppo homma.
Enää ei miettiminen auta vaan tarvitaan viisaampien apua.
Peruskysymys on siis, että jos haluan muuttaa kv:n kautta luodun olion. Esimerkiksi nyt Labelin kekstiä. Niin miten se onnistuu.
GeneerinenTuomas kirjoitti:
No sitä tässä on mietitty, että miten nuo saataisiin yhteen.
Luepa tuo edellinen viestini vielä ajatuksella. Keskity etenkin jälkimmäiseen koodilaatikkoon, jossa on korjaus koodiisi. Muilta osin koodisi on jo toimiva.
Koodisi ongelma ei ole Kivyn datan muuttaminen vaan se, että luot ylimääräisen KelloLabel-olion, joka ei ole Kivyn näkymässä mitenkään mukana, ja muokkaat tuota väärää oliota. Korjaus on esitetty jo edellä.
GeneerinenTuomas kirjoitti:
Olen tässä nyt 2 päivää yrittänyt lukea apia ja foorumeita ja google esimerkkejä, että miten pythonista muutetaan kv:n muuttujia.
Sattumaako, mutta itse päädyin Googlella suoraan Pong-esimerkkiin, jota selasin pari minuuttia, ja sain siitä yleiskuvan Kivyn toiminnasta (tuntematta Kivyä mitenkään etukäteen) ja näin useampia vastauksia yllä esittämääsi kysymykseen muuttujista. Ylipäänsä Kivyn sivuilla näyttää olevan sen verran noita esimerkkejä, että luulisi pääsevän sieltä kokeilemalla alkuun.
Noniin. Avautuihan se mysteeri sieltä.
Kiitoksia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.