# -*- coding: cp1252 -*- from tkinter import * import sys def lue(): teksti = str(Entry.get(kentta)) tulos = "Kirjoitit: " + teksti teksti_ikkuna['text'] = tulos def lopeta(): ikkuna.destroy() sys.exit(0) ikkuna = Tk() ikkuna.title("Lukukone") ikkuna.geometry("250x100") ruutu1 = Frame(ikkuna, borderwidth = 3) ruutu1.pack() ruutu2 = Frame(ruutu1, borderwidth = 3) ruutu2.pack(side = RIGHT) kentta = Entry(ruutu1) kentta.pack() teksti_ikkuna = Label(ruutu1, text = "") kentta.pack() lue_nappi = Button(ruutu2, text = "Lue teksti",\ width = 12, command = lue) lue_nappi.pack() lopeta_nappi = Button(ruutu2, text = "Lopeta",\ width = 12, command = lopeta) lopeta_nappi.pack(side = BOTTOM) ikkuna.mainloop()
Ohjelma on python 3
Ohjelmä tekee käyttöliittymän jossa on tekstikenttä ,lue teksti ja lopeta painikkeet.
Kun kirjoittaa tekstikenttään jotain ja painaa lue teksti painiketta,pitäisi teksti tulostua tekstikentä alapuolelle.
Mutta mitään ei tulostu,tietäiskö joku missä on vika.
Mod. lisäsi kooditagit. Kiinnitä myös huomiota viestiesi kieliasuun.
stt-73 kirjoitti:
Mutta mitään ei tulostu,tietäiskö joku missä on vika.
Ohjelmassa on parikin vikaa, ensinäkään Labelin tekstiä ei voi asetta käyttämälläsi tavalla, ja vaikka voisikin, et voi muuttaa funktion ulkopuolista muuttujaa funktiosta ilman, että määrittelet sen globaaliksi.
En ole Tkinter-guru, mutta tietääkseni "oikea" tapa muuttaa Labelin tekstiä on liittää siihen StringVar, jonka arvoa muutetaan tähän tyyliin:
import tkinter as tk def aseta (): teksti.set ("Bar") ikkuna = tk.Tk () kehys = tk.Frame (ikkuna) kehys.pack () teksti = tk.StringVar (value="Foo") tekstiloota = tk.Label (kehys, textvariable=teksti) tekstiloota.pack () nappi = tk.Button (kehys, text="Paina", command=aseta) nappi.pack () ikkuna.mainloop ()
teksti_ikkuna = Label(ruutu1, text = "") kentta.pack()
Tämän koodinpätkän toisella rivillä pitäisi ilmeisesti lukea teksti_ikkuna.pack()
. Nykyisellään Label jää "paketoimatta", joten se eikä siihen myöhemmin sijoitettu teksti tule näkyville ohjelmassa.
Kiitos,omaa huloimattomuuttani.
teksti_ikkuna.pack() siinä pitikin olla.
Tähän samaan ohjelmaan liittyen kysyisin vielä että miten pystyy määrittämään paikan käyttöliittymässä oleville komponenteille.
Tässä tapauksessa kentta, teksti_ikkuna, lue_nappi, lopeta_nappi
Esim.jos haluaa lue ja lopeta napit aivan liittymän oikeaan reunaa,alareunaan,tai ylös.
Tk:n kanssa kannattaa lukea hiukan ohjeita ja tutustua geometria managereihin. Googletappas vaikka grid ja pack.
Tk on graafinen kirjasto, mistä pythonin käyttämä Tkinter on vain yksi toteutus. Itse olen käyttänyt vain Infernon Tk-toteutusta, mikä on Tkinteria aika paljon joustavampi ja miellyttävämpi käyttää.
esim. Infernolla käyttöliittymän voisi määrittää yksinkertaisesti taulukollisella stringejä:
# Ikkunan debug-tiedolle käyttöliittymän määritykset. msg_cfg := array[] of { # kehykset "frame .msg", "frame .msg2", # tapahtumaikkuna "text .msg.t -width 32h -height 15h -state disabled -yscrollcommand {.msg.scroll set} -bg white", "scrollbar .msg.scroll -command {.msg.t yview}", # käyttäjälista "listbox .msg.l -width 15h -height 15h -state disabled -yscrollcommand {.msg.scroll2 set} -bg white", "scrollbar .msg.scroll2 -command {.msg.l yview}", # viesti-ikkuna "text .msg2.t2 -height 15h -state disabled -yscrollcommand {.msg2.scroll3 set} -bg white", "scrollbar .msg2.scroll3 -command {.msg2.t2 yview}", # pakkaa ja näytä "pack .msg.l -side left -expand 1 -fill both", "pack .msg.scroll2 -side left -fill y", "pack .msg.t -side left -expand 1 -fill both", "pack .msg.scroll -side left -fill y", "pack .msg -expand 1 -fill both -padx 5 -pady 5", "pack .msg2.t2 -side left -expand 1 -fill both", "pack .msg2.scroll3 -side left -fill y", "pack .msg2 -expand 1 -fill both -padx 5 -pady 5", "pack propagate . 0", "update" };
Tkinterin kanssa homma pelaa hiukan erilailla, mutta idea on silti sama. Eli siis voit pakata nappula kokonaisuudet ja muut härpäkkeet kehyksiin ja sitten pakata nuo kehykset vaikka allekkain.
Kiitoksia vastauksista
Aihe on jo aika vanha, joten et voi enää vastata siihen.