Hei.
Harjoittelin standardi kirjastojen käyttöä ja mm.
python- oppaassa ollutta datetime:ä.
Tämä siis tulostaa päivämäärän ja ajan.
Python shell:iin tulostikin samalla tavalla.
Mutta sitten kokeilin GUI:hin ja siinä jää sulut molemmin puolin tulostusta.
Kuinka pitäsi toimia että tulostus olisi myös GUI:ssa ilman sulkuja ja pisteet oikeanlaiset.
# -*- coding: cp1252 -*- from Tkinter import * import sys import calendar import datetime root = Tk() root.title('Kalenteri') root.geometry('') text = Label(root, text = 'Terve') text.grid(row = 0, column = 0) aika = datetime.datetime.now() print aika.strftime('%d.%m.%Y %H:%M:%S') text2 = Label(root, text = [aika]) text2.grid(row = 1, column = 0) root.mainloop()
Nythän tulostat tuon muotoillun ajan, etkä muotoile sitä alkuperäistä muuttujaa.
print aika.strftime('%d.%m.%Y %H:%M:%S') => aika = aika.strftime('%d.%m.%Y %H:%M:%S')
Sulut eivät katoa Macron korjauksellakaan, mutta parempaan suuntaan sillä kyllä päästään.
text2 = Label(root, text = [aika]) => text2 = Label(root, text = aika)
Niin no, empäs ajatellut että ne sulut olisi voitu tulostaa sinne kysyjän toimesta... Ihmetyttää kumminkin, että miksi ne noin sinne menevät. Eikös teksti pitäisi laittaa lainausmerkkejen sisään ja muuttujat plussalla joukkoon?
Esim. print "Terve " + kayttaja
Macro kirjoitti:
Eikös teksti pitäisi laittaa lainausmerkkejen sisään ja muuttujat plussalla joukkoon?
Laittamalla muuttujan hakasulkeiden sisään siitä tulee yksialkioinen lista, jonka Label näyttää aaltosulkeiden sisällä.
Aijoo.
Label ei näytä yksialkioista listaa aaltosulkeiden sisällä, vaan se näyttää listan alkioina olevat merkkijonot aaltosulkeiden sisällä, silloin kun näissä merkkijonoissa on välilyönti. Tässä on esimerkki:
text2 = Label(root, text = ["on vali", "eioo", "taas on", "kukka", "peruna"])
Sitä vastaava tulostus kokonaisen ohjelman tuottamassa Tk-ikkunassa on seuraavanlainen minun koneessani olevalla Pythonin ja Tk:n versioilla:
{ on vali } eioo { taas on } kukka peruna
En tiedä missä tämä ominaisuus on dokumentoitu, mutta näin se näyttäisi toimivan. Lisäksi en voinut kopioida tekstiä Tk-ikkunasta, joten en ole varma onko siinä välilyöntejä juuri tuolla tavalla. Suunnilleen tuolta se näyttää.
Tätä ominaisuutta ei tarvitse tuntea erityisen perusteellisesti, jos ei laita text-parametrin arvoksi muuta kuin merkkijonoja :)
Kiitos noin se meneekin.
Pitää yrittää vaan harjoitella, pikkuhiljaa oppii jotain.
Hei, pystyykö tästä datetime: sta soveltamaan toimivaa kelloa jossa sekunnit, minuutit ja muutkin muuttuisivat ajan mukaan.
Python kielistä selkeää ohjetta en tähän löytänyt.
Java kielisen löysin, mutta onnistuuko Javan ja Pythonin yhteen sovittaminen miten.
Mielestäni ei kannata yrittää ohjelmoida Pythonia kuten se olisi Java, tai toisinpäin. Jonkinverran yhteisiä periaatteita voi soveltaa, mutta kielet ovat kuitenkin erilaisia monella tasolla.
Tein lyhyen esimerkin Tkinter-kirjaston after-funktion käytöstä, jolla voi kutsua jotakin funktiota annetun millisekuntimäärän jälkeen. Keksimäni päivitysaika kerran puolessa sekunnissa on ehkä jotenkin kellolle sopiva. Ohjeen löysin täältä:
http://www.pythonware.com/library/tkinter/
(Tämä on se vanhempi Tkinter-opas. Uudempi ei tullut hakuosumana. Toivottavasti mikään oppi ei ole vanhentunut pahasti.)
Lisäksi käytän StringVar-oliota, jonka avulla jotakin tekstiä voi päivittää helposti. Siitä on myös ohjeita ympäri nettiä, jos se ei ole vielä tuttu. Koodini pohjautuu yllä esitettyyn esimerkkiin. Koneessani on Python 2.7, jolla tämä toimii ainakin.
# -*- coding: utf-8 -*- from Tkinter import * import sys import calendar import datetime INTERVAL = 500 # millisekunteja, joten 0.5 sekuntia root = Tk() root.title('Kellopa kello') text = Label(root, text = 'Kello on nyt') text.grid(row = 0, column = 0) clocktime = StringVar() time = datetime.datetime.now() clocktime.set(time.strftime('%H:%M:%S')) text2 = Label(root, textvariable = clocktime) text2.grid(row = 1, column = 0) def clock_update(): global clocktime root.after(INTERVAL, clock_update) time = datetime.datetime.now() clocktime.set(time.strftime('%H:%M:%S')) root.after(INTERVAL, clock_update) root.mainloop()
Kiitos
Pekka Karjalaisen koodissa on tarpeetonta toistoa: clock_update sisältää aivan samanlaiset rivit, kuin sen ulkopuolella ovat. Ulkopuoliset kannattaisi siis korvata yksinkertaisesti kutsulla funktiolle clock_update.
Aihe on jo aika vanha, joten et voi enää vastata siihen.