Ohjelmoinnin peruskurssien laaja oppimäärä

Samankaltaiset tiedostot
Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä, kevät

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 6: Python

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssien laaja oppimäärä

JWT 2016 luento 11. to klo Aulikki Hyrskykari. PinniB Aulikki Hyrskykari

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Jypelin käyttöohjeet» Ruutukentän luominen

Ohjelmoinnin peruskurssien laaja oppimäärä

Action Request System

Graafinen käyttöliittymä, osa 1

Ohjelmoinnin perusteet Y Python

Android ohjelmointi Tunti 2. Käyttöliittymät ja resurssit

19/20: Ikkuna olio-ohjelmoinnin maailmaan

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Ohjelmoinnin perusteet Y Python

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

Tietokantasovellus (4 op) - Web-sovellukset ja niiden toteutus

Ohjelmoinnin peruskurssi Y1

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

15. Ohjelmoinnin tekniikkaa 15.1

Ohjelmoinnin peruskurssien laaja oppimäärä

Luento 5. Timo Savola. 28. huhtikuuta 2006

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Graafisen käyttöliittymän ohjelmointi

Ohjelmoinnin peruskurssien laaja oppimäärä

Racket ohjelmointia II. Tiina Partanen 2015

Kieliversiointityökalu Java-ohjelmistoon. Ohje

815338A Ohjelmointikielten periaatteet

ASENNUS- JA KÄYTTÖOHJE

Ohjelmoinnin perusteet Y Python

DXL Library ja DXL-kielen olemus. Pekka Mäkinen SoftQA Oy http/

Ohjelmoinnin peruskurssien laaja oppimäärä

17/20: Keittokirja IV

C# Windows ohjelmointi perusopas

Arkkitehtuurikuvaus. Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy. Ryhmä 14

Tämän lisäksi listataan ranskalaisin viivoin järjestelmän tarjoama toiminnallisuus:

CODEONLINE. Monni Oo- ja Java-harjoituksia. Version 1.0

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

Ohjelmoinnin perusteet Y Python

Johdatus Ohjelmointiin

Ohjelmistojen mallintaminen viikon 4 laskareiden mallivastauksia

ASENNUS JA KÄYTTÖOHJE

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tehdään sähköisesti mikroluokan Windows-koneilla.

Ohje 1 (12) Maarit Hynninen-Ojala MOODLE PIKAOHJE. Kirjautuminen Moodleen ja työtilan valitseminen

Ohjelmoinnin peruskurssi Y1

Sokkelon sisältö säilötään linkitetyille listalle ja tekstitiedostoon. Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Eclipse & WindowBuilder

15. Ohjelmoinnin tekniikkaa 15.1

Test-Driven Development

HOJ J2EE & EJB & SOAP &...

Ohjelmoinnin perusteet Y Python

Toinen harjoitustyö. ASCII-grafiikkaa

HSMT J2EE & EJB & SOAP &...

Sonera Viestintäpalvelu VIP VIP Laajennettu raportointi Ohje

SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tehdään sähköisesti mikroluokan Windows-koneilla.

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

SQL Buddy JAMK Labranet Wiki

Transkriptio:

Ohjelmoinnin peruskurssien laaja oppimäärä Luento 5: Serialisointi, lisää ohjelmien suunnittelusta, GUI-ohjelmointia Riku Saikkonen (osa kalvoista on suoraan ei-laajan kurssin luennoista) 22. 2. 2012

Sisältö 1 Serialisointi 2 Lisää ohjelmien suunnittelusta 3 Graasten käyttöliittymien ohjelmointia: PyQt

Yleisiä tapoja datan siirtoon useimmat ohjelmat tallettavat ja lataavat dataa tiedostoista tai esim. verkon yli toiselta ohjelmalta esim. lautapeli voisi tallentaa pelin (eli laudan sisällön) tai verkkopelinä toimiessaan lähettää sen toiselle pelaajalle miten tällainen data kannattaa esittää? itse keksityllä binääri- tai tekstitiedostolla? jollain puolivalmiilla formaatilla kuten XML:nä? jonkin muun ohjelman ennestään käyttämällä formaatilla? omia binääriformaatteja on helppo tuottaa joistain ohjelmointikielistä (muistin sisältö levylle), mutta vaikea käsitellä muilla kielillä tai eri versioilla seuraavilla kalvoilla on muutama yleinen puolivalmis formaatti

Datan serialisointi serialisointi (serialization, marshalling) tarkoittaa ohjelmassa olevan datan muuttamista merkkijonoksi ja takaisin erityisesti ohjelmointikielen tietorakenteiden automaattista tallentamista ja lataamista esim. Schemessä read ja write toteuttavat Scheme-datan serialisoinnin mm. Pythonissa ja Javassa on valmiit kirjastot olioiden serialisointiin kielen omaan (binääri)formaattiin kaikkea ei voi serialisoida (esim. funktioita) usein serialisointi tehdään kuitenkin käytännössä osittain käsin esimerkiksi jotta ohjelman eri versiot toimisivat ristiin, vaikka olioiden rakenne muuttuu

Sulkulausekkeet Esimerkki datasta (osm ((version "0.6") (generator "CGImap 0.0.2")) (bounds 60.1711000 24.8552600 60.1760400 24.8672200) (way 26026161 (user "alv") (uid 4660) (visible #t) (version 2) (changeset 139696) (timestamp "2008-08-08T08:00:57Z") (nodes 284132199 284132200 286097549) (tags ("highway" "footway") ("surface" "unpaved")))) Schemen read- ja write-primitiivit käyttävät Scheme-koodin näköistä sulkulauseke-esitysmuotoa esitysmuoto on nimeltään S-expression (symbolic expression) sitä on kohtalaisen helppo kirjoittaa ja lukea automaattisesti ilmankin ohjelmointikielen tukea

JSON (JavaScript Object Notation) Esimerkki datasta { "osm": { "version": "0.6", "generator": "CGImap 0.0.2" }, "bounds": { "minlat": 60.1711000, "minlon": 24.8552600, "maxlat": 60.1760400, "maxlon": 24.8672200 }, "ways": [ { "id": 26026161, "user": "alv", "uid": 4660, "visible": true, "version": 2, "changeset": 139696, "timestamp": "2008-08-08T08:00:57Z", "nodes": [ { "ref": 284132199 }, { "ref": 284132200 }, { "ref": 286097549 } ], "tags": [ { "k": "highway", "v": "footway" }, { "k": "surface", "v": "unpaved" } ] } ] } JSON-formaatti on tehty JavaScript-kielen pohjalta periaatteessa se on koodia (olion ja/tai taulukon alustus), jonka voisi suoraan antaa JavaScript-tulkille käytännössä sitä useimmiten luetaan kirjaston avulla käytetään varsinkin webbisovelluksissa selaimessa pyörivän JavaScript-koodin ja palvelimen väliseen tiedonsiirtoon

XML Esimerkki datasta (pala OpenStreetMap-dataa) <?xml version="1.0" encoding="utf-8"?> <osm version="0.6" generator="cgimap 0.0.2"> <bounds minlat="60.1711000" minlon="24.8552600" maxlat="60.1760400" maxlon="24.8672200"/> <way id="26026161" user="alv" uid="4660" visible="true" version="2" changeset="139696" timestamp="2008-08-08t08:00:57z"> <nd ref="284132199"/> <nd ref="284132200"/> <nd ref="286097549"/> <tag k="highway" v="footway"/> <tag k="surface" v="unpaved"/> </way> </osm> XML-esitysmuotoon kuuluu yleensä skeema (schema), joka määrittelee, mitä alikohtia missäkin saa olla ja valmiita työkaluja, jotka tarkistavat skeemanmukaisuuden, editoivat XML:ää, hakevat XML:stä osia tietyillä hakuehdoilla, konvertoivat XML:ää muunlaisiin formaatteihin, jne. XML:n käsittelyyn on kirjastoja useimmissa ohjelmointikielissä

Itse tehdyt formaatit hyvin usein ohjelmissa käytetään edellä lueteltujen formaattien sijaan omia itse suunniteltuja formaatteja etuja: joustavampia ja tilanteeseen sopivampia, joskus yksinkertaisempia ymmärtää, usein helpompia kirjoittaa käsin haittoja: itse tehty jäsennin ei yleensä ole yhtä monipuolinen; omaa formaattia käsitteleviä muita työkaluja ei ole valmiina etu ja haitta: ei tarvitse käyttää valmiita kirjastoja se, että jokin data esitetään sulkulausekkeina, JSONina tai XML:nä ei useinkaan kerro vielä kovin paljon pitää vielä määritellä, miten niitä käytetään nämä valmiit formaatit helpottavat suunnittelua, mutta eivät tee sitä ohjelmoijan puolesta usein näiden valmiiden formaattien sisälle (esim. tiettyihin merkkijonoihin) määritellään vielä itse jokin oma formaatti

(ei-laajan kurssin kalvo: luento 5 sivu 19) Säilöntää Moduuli pickle muuttaa lähes minkä tahansa Pythonin olion merkkjonomuotoon (pickling) ja takaisin (unpickling). Merkkijonomuotoinen esitys voidaan tallentaa tiedostoon, muuttujaan tai vaikka lähettää verkon yli toiseen koneeseen. # kirjaolio tiedostoon p_file = open('sailo.txt', 'w') pickle.dump(library['king Stephen']['Hohto'], p_file) p_file.close() # ja takaisin p_file = open('sailo.txt', 'r') book = pickle.load(p_file) p_file.close() print book.get_details() 14:58

Mitä muuta Pythonista löytyy? picklen formaatti on Pythonille sisäinen ei ole tarkoitus käsitellä muuten kuin pickle-kirjastolla samoin Javan serialisointi joten näissä on se ongelma, että ne eivät toimi kunnolla kielten välillä eikä tiedostoformaattia voi luotettavasti dokumentoida Pythonin repr-funktio tuottaa tekstimuotoisen esityksen argumentistaan (esim. "['abc', 3, [1, 2, 3]]") kuten Schemen write, paitsi että repr:n tulostetta ei ole tarkoitus lukea takaisin Pythoniin Pythonista löytyy kirjastot mm. XML:n, JSONin ja sulkulausekkeiden käsittelyyn (JSONille useitakin) entä pitääkö kirjastolta saaduille olioille tehdä vielä itse jotain? yleensä ne pitää käydä läpi ja tarkistaa, varsinkin jos data tulee ohjelman tai sen käyttäjän ulkopuolelta kirjastot siis auttavat mutta eivät korvaa kokonaan esim. datatiedoston tai verkkopaketin lukevaa funktiota

Sisältö 1 Serialisointi 2 Lisää ohjelmien suunnittelusta 3 Graasten käyttöliittymien ohjelmointia: PyQt

(ei-laajan kurssin kalvo: luento 2 sivu 8) Sunnittelu Suunnittelussa ohjelma kannattaa jakaa jonkinlaisiin alijärjestelmiin Tarpeettomia riippuvuuksia näiden välillä vältettävä Sykliset riippuvuudet voivat aiheuttaa ongelmia Esimerkki : Käyttöliittymän ja logiikan erottaminen Logiikka (pelin logiikka, numeroilla tehtävä simulointi, tietokanta jne) kirjoitetaan itsenäiseksi osaksi joka ei tiedä millaisella käyttöliittymällä sitä käytetään. Pohdi millaisia metodeja luokkien julkiseen rajapintaan tarvitaan että eri käyttöliittymät voivat ohjata logiikkaa ja hekea tietoa Käyttöliittymä (GUI) on oma osionsa. Käyttäjän toimet kutsuvat GUI:n kautta logiikan metodeita. Käyttöliittymä hakee logiikalta ruudulla näyttämänsä tavaran. GUI ohjaa, pyytää tietoa Aivot 11:31

(ei-laajan kurssin kalvo: luento 2 sivu 10) Suunnittelu Model-View-Controller Tämä suunnittelumalli menee vielä askeleen pidemmälle, erottaen GUI:n (Controller) osat jotka muuttavat mallia (Model) ja osat jotka vain esittävät mallin sisältämää tietoa(view) Controller Tiedot päivittyivät ohjaus muutoskäskyt View Esitettävän datan kysely Tiedot päivittyivät, käy kysymässä Model 11:31

Lisää ModelViewControllerista Model, malli: sisältää ohjelman tallettaman datan ja tavat kysellä ja muuttaa sitä usein myös lähettää tietoja muutoksista niitä pyytäneille datan esitysmuotoa voisi vaihtaa pelkkää mallia muuttamalla joskus osa mallista on tietokannassa View, näkymä: käyttöliittymä tai erityisesti sen osa, joka näyttää asioita sillä voi olla omaa tilaa, jota esim. ei talleteta (mikä kohta datasta on tällä hetkellä näkyvissä?) perusideaan kuuluu, että näkymiä voisi olla yhtäaikaisesti monta erilaista (joskus onkin) Controller, ohjain: mallia muuttavat osat ohjelmasta (käyttöliittymästä ja automaattisesti esim. laskemalla) ei kerro näkymälle datasta (näkymä hakee ne mallilta)

(ei-laajan kurssin kalvo: luento 2 sivu 11) Suunnittelu Turhien riippuvuuksien välttäminen kannattaa myös alemmilla tasoilla Toisaalta samasta tiedosta ei yleensä kannata pitää useita kopioita Yhtä päivitettäessä pitää aina päivittää muutkin Myös riippuvasta datasta olevat kopiot voivat olla ongelmallisia Tällöin riippuvan datan turha uudelleenlaskeminen voi olla hyödyllistä. 11:31

Lisää suunnitteluvaihtoehtoja joskus suunniteltava ohjelma kannattaa jakaa osiin useampi ohjelma tai (yleiskäyttöisiä) kirjastoja + ohjelma joskus näitä osia voi yhdistää monella tavalla usein niitä voi käyttää yksinään (ei välttämättä kätevästi) hyödyllinen ajattelutapa: rajapinta voi olla kieli oikea pieni kieli, jota esim. tulkataan tai kokoelma funktioita, jotka on nimetty niin että niitä käyttävä koodi muistuttaa kieltä (esim. SICPin picture language-esimerkki) tai niin yleiskäyttöisiä funktioita, että niitä voi käyttää yhtä monipuolisesti kuin kieltä (esim. listankäsittelyfunktiot?) joskus kannattaa yleistää jos rajapinta vaikuttaa monimutkaiselta, voi olla parempi jakaa se geneerisempiin osiin mutta liika abstrahointi johtaa vaikeasti lähestyttävään koodiin

(ei-laajan kurssin kalvo: luento 2 sivu 12) Suunnittelu Mistä tiedetään, mitä luokkia pitäisi laatia tietyn ongelman ratkaisemiseksi? Millaisia kenttiä ja metodeja niille tulee? Ei ole yhtä parasta ratkaisua. Suunnittelutavoitteet voivat olla ristiriitaisia tasapainottelu, kompromissit. Ei ole menetelmää, jolla päästään varmasti hyvään tulokseen. Ei ole yleispätevää tapaa selvittää, onko jokin ratkaisu hyvä tai huono. Useimmille nyrkkisäännöille löytyy tapauksia, joissa kannattaakin toimia toisin. 11:31

(ei-laajan kurssin kalvo: luento 2 sivu 13) Substantiivimenetelmä Yksi kirjallisuudessa esitelty tekniikka tehdä ensimmäinen malli ohjelman luokkarakenteesta 1)Kirjoitetaan lyhyehkö mutta tarkka sanallinen kuvaus ohjelman toimintavaatimuksista 2)Etsitään kuvauksesta kaikki verbit ja substantiivit 3)päätetään mitkä substantiiveista ovat luokkia, mitä näiden luokkien kenttiä 4)päätetään mitkä verbeistä ovat luokkien metodeja Vain alustava malli Kun ensimmäinen malli on saatu pohdittua niin sitä ryhdytään muokkaamaan ja tarkistetaan voidaanko sen avulla todella toteuttaa vaatimukset. 11:31

(ei-laajan kurssin kalvo: luento 2 sivu 17) Käyttötapaukset (use case) ja mallin kehittäminen Kun alustava malli on rakennettu, kokeile sitä jo ennen koodausta erilaisilla käyttötavoilla Esim. Kuinka ja mitä metodeja kutsuttaisiin jos käyttäjä siirtää rahaa tililtä toiselle? Miten metodit tilisiirrossa kutsuvat toisiaan? Millaisia parametreja pitäisi laittaa? Löytyykö luokista tarvittavaa dataa. Muokkaa ja tarkenna mallia käymällä läpi joukko erilaisia käyttötapauksia. Kun olet tyytyväinen alustavaan malliin voit aloittaa koodailun. Malli tulee varmasti muuttumaan vielä koodausvaiheessa 11:31

Pohdintaa ohjelman suunnittelu on eniten luovuutta ja kekseliäisyyttä vaativa osa ohjelmoinnissa ellei sitten sen suunnittelu, mitä ohjelman pitäisi tehdä... tarkkoja sääntöjä ei ehkä kannata edes etsiä? suunnittelu on osin taidetta (kuinka paljon?) onkohan ohjelmoinnissa tyylisuuntia kuten taidehistoriassa? (esim. olio-ohjelmointi?) useimmissa taidemuodoissa tyylisuunnista yksi kerrallaan on hallitseva (jonkin aikaa ja tietyllä alueella) ja seuraava tyylisuunta on melkein aina jossain asioissa parempi mutta toisissa huonompi joskus suunnittelun taustalla on (ollut?) pyrkimys löytää oikea tapa tehdä jokin tietty asia, The Right Thing esim. SICPin symbolinen derivoija taisi syntyä 60-luvulla näin suunnittelua oppii harjoittelemalla, mutta myös lukemalla muiden tekemiä ohjelmia

Sisältö 1 Serialisointi 2 Lisää ohjelmien suunnittelusta 3 Graasten käyttöliittymien ohjelmointia: PyQt

(ei-laajan kurssin kalvo: luento 6 sivu 6) PyQt PyQt ei ainoa mahdollisuus (PySide, Tkinter, wxpython,... Tkinter on vanha Pythonin mukana tuleva kirjasto PyQt Ei erillisiä asennuksia Joidenkin mielestä vanha mutta edelleen käytetty Asennettava erikseen Pohjalla Qt alustariippumaton rajapintatyökalu ja sidonnat Pythoniin Käytetään tällä kurssilla (toki muitakin saa käyttää mutta tukea ei välttämättä saa) PySide on tämän uudempi versio. Perusasiat pitkälti samoin kummassakin, erona lisenssi PyQt: GPL PySide: LGPL 18:47

(ei-laajan kurssin kalvo: luento 6 sivu 9) Yleiskatsaus Graafinen käyttöliittymä sisältää nappeja, valintaruutuja, valikoita, paneeleja, jne. Jotta voi rakentaa toimivan graafisen käyttöliittymän, tarvitsee tietää: kuinka graafisia komponentteja luodaan Kuinka ne saadaan näkymään ruudulla Kuinka ne saadaan ruudulla sinne, minne halutaan Kuinka ne saadaan tekemään halutuja asioita Graafisia komponentteja luodaan, kuten mitä tahansa Pythonin olioita 18:47

(ei-laajan kurssin kalvo: luento 6 sivu 10) import sys from PyQt4 import QtGui class Example(QtGui.QMainWindow): def init (self): Muistettava kutsua super(example, self). init () yliluokan init self.initui() Ikkunan asetukset Siisti lopetus, kun Mainloop loppuu def initui(self): self.setgeometry(300, 300, 650, 450) self.setwindowtitle('main window') self.show() Tuo ikkuna näkyville def main(): Aina täytyy olla yksi sovellusolio app = QtGui.QApplication(sys.argv) ex = Example() Mahdolliset sys.exit(app.exec_()) komentoriviargumentit if name == ' main ': main() Vasen yläkulma X ja y Komentoriviargumentteja varten Tuodaan graafiset komponentit Tehdään pääikkuna Aloitetaan sovellus ja käynnisteään tapahtumakuuntelija (mainloop) Leveys ja korkeus 18:47

(ei-laajan kurssin kalvo: luento 6 sivu 11) def initui(self): Lisää sisällön exit_action = QtGui.QAction(QtGui.QIcon('./exit.png'), '&Exit', self) exit_action.setshortcut('ctrl+q') exit_action.triggered.connect(qtgui.qapp.quit) menubar = self.menubar() file_menu = menubar.addmenu('&file') file_menu.addaction(exit_action) Aiheuttaa sovelluksen loppumisen self.toolbar = self.addtoolbar('exit') self.toolbar.addaction(exit_action) self.setgeometry(300, 300, 850, 650) self.setwindowtitle('main window') self.show() 'window title' työkalupalkille 18:47

(ei-laajan kurssin kalvo: luento 6 sivu 12) Ikkunan voi periä myös QWidget luokasta mutta silloin työkalu- ja valikkopalkit eivät ole lisättävissä. class Example(QtGui.QWidget): def init (self): super(example, self). init () self.initui() def initui(self): self.button = QtGui.QPushButton("Push", self) self.button.move(30, 50) self.button.clicked.connect(self.button_pressed) Mihin komponenttiin self.setgeometry(300, 300, 290, 150) self.setwindowtitle('event sender') self.show() Liittää nappulan painamisen tapahtumankäsittelijään def button_pressed(self): self.button.settext('pressed') Vaihtaa nappulan tekstin 18:47

(ei-laajan kurssin kalvo: luento 6 sivu 13) def initui(self): self.label = QtGui.QLabel("Say hello:", self) self.hello_edit = QtGui.QLineEdit(self) self.clear_button = QtGui.QPushButton("Clear", self) self.clear_button.clicked.connect(self.button_pressed) self.message = QtGui.QLabel('message label', self) self.hello_edit.textedited.connect(self.onedited) #Horizontal layout h_box1 = QtGui.QHBoxLayout() h_box1.addwidget(self.label) h_box1.addwidget(self.hello_edit) h_box1.addwidget(self.clear_button) h_box2 = QtGui.QHBoxLayout() h_box2.addwidget(self.message) #vertical layout v_box = QtGui.QVBoxLayout() v_box.addlayout(h_box1) v_box.addlayout(h_box2) self.setlayout(v_box) self.setgeometry(300, 300, 890, 650) self.setwindowtitle('layout example') self.show() def button_pressed(self): self.hello_edit.settext('') self.message.settext('') def onedited(self, text): self.message.settext(text) self.message.adjustsize() Jos tekstirivi muuttuu, mennään metodiin onedited Vaakatason layout komponentti Toiselle riville samanlainen Laitetaan ne päällekkäin pystysuunnan layout-komponenttiin Pystysuunnan komponentti määrää Ikkunan asettelun 18:47

(ei-laajan kurssin kalvo: luento 6 sivu 14) Useamman rivin tekstikenttä Luodaan ruudukko def initui(self): grid = QtGui.QGridLayout() rivi sarake grid.addwidget(qtgui.qlabel('one'), 0, 0) grid.addwidget(qtgui.qlabel('two'), 0, 1) grid.addwidget(qtgui.qlabel('three'), 0, 2) grid.addwidget(qtgui.qlabel('four'), 1, 0) grid.addwidget(qtgui.qlabel('five'), 1, 2) grid.addwidget(qtgui.qlabel('six'), 2, 0) grid.addwidget(qtgui.qlabel('seven'), 2, 1) grid.addwidget(qtgui.qtextedit(), 3, 0, 2, 3) self.setlayout(grid) Ikkunan asettelu ruudukkona self.resize(300, 200) self.move(300, 150) self.setwindowtitle('grid example') self.show() Lisätään ruudukkoon komponentteja Useamman ruudun kattava komponentti Monelle riville ja sakkeelle Alkuruutu: rivi, sarake 18:47

(ei-laajan kurssin kalvo: luento 6 sivu 15) Muutama muistettava Jos periytät ikkunasi QMainWindow-luokasta, täytyy siihen luoda CentralWidget, joka pitää sisällään kaikki ikkunan komponentit. Vaikka näin: self.main_widget = QtGui.QWidget(self) self.setcentralwidget(self.main_widget) okbutton = QtGui.QPushButton("OK", self.main_widget) Jos tarvii, niin komponentteja voi asetella myös pakotetusti annettuun kohtaan ikkunassa: lbl1 = QtGui.QLabel('Laput', self) lbl1.move(15, 10) lbl2 = QtGui.QLabel('pysyvät', self) lbl2.move(35, 40) Ikkunan kokoa muutettaessa nämä eivät siirry 18:47

(ei-laajan kurssin kalvo: luento 6 sivu 8) Mistä löytää tietoa Alkuun pääsee lukemalla seuraavan: http://zetcode.com/tutorials/pyqt4/ Tai http://www.learningpython.com/2008/09/20/an-introduction-to-pyqt/ PyQt:n luokkakuvaukset http://www.riverbankcomputing.com/static/docs/pyqt4/html/classes.html 18:47