Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Tk ja kirjastot

Sivun loppuun

stt-73 [21.12.2011 21:03:25]

#

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

Macro [21.12.2011 21:19:38]

#

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

-tossu- [21.12.2011 21:23:28]

#

Sulut eivät katoa Macron korjauksellakaan, mutta parempaan suuntaan sillä kyllä päästään.

text2 = Label(root, text = [aika])
=>
text2 = Label(root, text = aika)

Macro [21.12.2011 21:28:25]

#

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

-tossu- [22.12.2011 00:55:54]

#

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

Macro [22.12.2011 07:40:11]

#

Aijoo.

Pekka Karjalainen [22.12.2011 08:58:42]

#

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

stt-73 [22.12.2011 19:38:35]

#

Kiitos noin se meneekin.
Pitää yrittää vaan harjoitella, pikkuhiljaa oppii jotain.

stt-73 [26.12.2011 20:19:09]

#

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.

Pekka Karjalainen [26.12.2011 21:04:07]

#

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/introduction/x9507-alarm-handlers-and-other.htm

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

stt-73 [28.12.2011 15:28:48]

#

Kiitos

Metabolix [28.12.2011 16:58:53]

#

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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta