Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python ja Kivy

GeneerinenTuomas [26.03.2016 20:20:54]

#

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()

Hennkka [26.03.2016 23:04:13]

#

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).

GeneerinenTuomas [27.03.2016 10:20:06]

#

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()

Metabolix [27.03.2016 11:46:06]

#

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

GeneerinenTuomas [27.03.2016 12:46:26]

#

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.

Metabolix [27.03.2016 14:22:55]

#

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.

GeneerinenTuomas [27.03.2016 18:31:31]

#

Noniin. Avautuihan se mysteeri sieltä.
Kiitoksia.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta