Mokomės Python vartotojo sąsajos kūrimo su Tkinter moduliu

Visai neseniai rašiau mažą programėlę informatikos pamokai kaip pavyzdį, kaip atrodo Python. Kadangi pagalvojau, kad rodyti vien tik konsolės langą (cmd), atrodo negražiai, paprogramavau šiokią tokią vartotojo sąsają (GUI). Taigi trumpai ir su pavyzdžiais pabandysiu aprašyti visą procesą.

Prieš pradedant, noriu pranešti, kad bus reikalingos bent minimalios Python OOP žinios.
Pirmiausiai, iškelkime sau problemą. Parašysime programą, kuri atvaizduotų Fibonačio skaičių seką iki tam tikro skaičiaus, kurį mes įvesime patys. Programos lange turi būti: įvedimo laukelis, patvirtinimo mygtukas ir laukas, kuriame išvesime skaičių seką. Beje, funkcija, gauti Fibonačio skaičių seką, yra Python manual‘e, todėl nereikės jos rašytis patiems. Užteks truputį paredaguoti.


Štai taip atrodys mūsų programa

Pradedam nuo modulių įterpimo:

# -*- coding: utf-8 -*-
from Tkinter import *
from tkFont import *

Apsirašom klasę:

class application(Tk):
   def __init__(self):
      Tk.__init__(self, parent)
      self.parent = parent
      self.initialize()

Tk.__init__() inicijuoja Tkinter klasę, self.initialize() iškviečia mūsų klasės metodą.

Pradedam rašyti pagrindinį mūsų metodą, kuris ir sukurs visą programos langą:

   def initialize(self):
      self.grid()

grid() suskirsto programos langą į koordinates (0; 0 — kairysis viršutinis kampas). Tai turbūt pats lengviausias būdas išdėstyti elementus programos lange.

      # nustatome šrifto, kuris bus naudojamas įrašymo ir atvaizdavimo laukuose, parametrus
      self.font = Font(self, family="Arial", size=15)
      # patvirtinimo mygtuko šriftas
      self.ButtonFont = Font(self, family="Arial", size=10)

      # sukuriame įrašo kintamąjį (StringVar() f-ja), įrašo laukelį, „pastatome“ jį į 0; 0 poziciją ir nustatome kintamojo reikšmę
      self.entryVar = StringVar()
      self.entry = Entry(self, font=self.font, textvariable=self.entryVar)
      self.entry.grid(column=0, row=0, sticky="WE")
      self.entryVar.set(u"Įveskite sveikąjį skaičių")

Trumpai apie kiekvieną parametrą:

  • font — nustato šriftą.
  • textvariable — nustato teksto kintamąjį
  • sticky — prie kurios kraštinės „prilipinti“ elementą
    • W — (West) kairė
    • E — (East) dešinė
    • N — (North) viršus
    • S — (South) apačia

Na, o „column“ ir „row“ aprašinėti manau, kad nereikia. Pavadinimai kalba patys už save. :)

Tęsiam darbą

      # sukuriame patvirtinimo mygtuką. Parametrai identiški Entry() f-jai. Apie „command“ skaitykite po kodu
      button = Button(self, font=self.ButtonFont, text=u"Rodyti seką", command=self.OnButtonClick)
      button.grid(column=0, row=1, sticky="W")

      # sukuriame lauką, kuriame atvaizduosime seką, nepamirškime kintamojo. Parametrai vėlgi toki patys, kaip anksčiau. Nauji tik trys, bet apie juos po kodo
      self.labelVar = StringVar()
      label = Label(self, font=self.font, textvariable=self.labelVar, fg="black", bg="gray", wraplength=300)
      label.grid(column=0, row=3, sticky="WE")
      self.labelVar.set(u"Neįvestas joks skaičius")
  • fg — teksto spalva
  • bg — fono spalva
  • wraplength — kas kiek laužyti tekstą. T.y. perkelti į naują eilutę.
  • command — komanda, kurią turime įvykdyti, kai paspaudžiamas patvirtinimo mygtukas. Mes kreipiamės į metodą „OnButtonClick“, kurį aprašysime šiek tiek vėliau.
      # nurodome, kad elementai, keičiant lango dydį, keistųsi ir elementų dydis
      self.grid_columnconfigure(0, weight=1)
      # nurodome, kad keisti lango dydį galime tik horizontaliai
      self.resizable(True, False)
      # atnaujiname langą
      self.update()
      # nurodome, kad pelės kursorius iš karto būtų įrašo laukelyje. Taip pat laukelio tekstas pažymimas automatiškai.
      self.entry.focus_set()
      self.entry.selection_range(0, END)

Pagrindinis metodas baigtas. Dabar susikursime metodą, kuris įvykdys komandas (atvaizduos tekstą), paspaudus patvirtinimo mygtuką.

   def OnButtonClick(self):
      self.labelVar.set( self.fib( int( self.entryVar.get() ) ) )

      self.entry.focus_set()
      self.entry.selection_range(0, END)

Čia suteikiame kintamąjam „labelVar“ (self.labelVar.set) reikšmę. Reikšmė — metodo fib() grąžinta reikšmė. Metodo fib() argumentas — iš įrašo laukelio paimta reikšmė (self.entryVar.get()), kuri paverčiama į sveikojo skaičiaus tipą (int()).

Ir paskutinis klasės metodas — fib:

   def fib(self, n):
      self.result = ''
      self.a, self.b = 0, 1
      while self.a < n:
         self.result = self.result+' '+ str(self.a)
         self.a, self.b = self.b, self.a + self.b
      return self.result

Klasė baigta, dabar tereikia ją iškviesti, nustatyti lango pavadinimą ir paleisti ciklą, kurio dėka programa iš karto neišsijungs.

app = application(None)
app.title(u"Fibonačio seka")
app.mainloop()

Na ir ką, dabar galima paleisti programą ir įvesti bet kokį sveikąjį skaičių ir bus atvaizduota seka iki to skaičiaus. Žinoma, praktikoje šios programos pritaikyti, galima sakyti, nėra kur, tačiau nepamirškit, kad ji veikia tik supažindinimo tikslu.

Pabaigai visas kodas nuo A iki Ž.

# -*- coding: utf-8 -*-
from Tkinter import *
from tkFont import *

class application(Tk):
   def __init__(self, parent):
      Tk.__init__(self, parent)
      self.parent = parent
      self.initialize()

   def initialize(self):
      self.grid()
      self.font = Font(self, family="Arial", size=15)

      self.ButtonFont = Font(self, family="Arial", size=10)

      self.entryVar = StringVar()
      self.entry = Entry(self, font=self.font, textvariable=self.entryVar)
      self.entry.grid(column=0, row=0, sticky="WE")
      self.entryVar.set(u"Įveskite sveikąjį skaičių")

      button = Button(self, font=self.ButtonFont, text=u"Rodyti seką", command=self.OnButtonClick)
      button.grid(column=0, row=1, sticky="W")

      self.labelVar = StringVar()
      label = Label(self, font=self.font, textvariable=self.labelVar, fg="black", bg="gray", wraplength=300)
      label.grid(column=0, row=3, sticky="WE")
      self.labelVar.set(u"Neįvestas joks skaičius")

      self.grid_columnconfigure(0, weight=1)
      self.resizable(True, False)
      self.update()
      self.entry.focus_set()
      self.entry.selection_range(0, END)

   def OnButtonClick(self):
      self.labelVar.set( self.fib( int( self.entryVar.get() ) ) )
      self.entry.focus_set()
      self.entry.selection_range(0, END)

   def fib(self, n):
      self.result = ''
      self.a, self.b = 0, 1
      while self.a < n:
         self.result = self.result+' '+ str(self.a)
         self.a, self.b = self.b, self.a + self.b
      return self.result

app = application(None)
app.title(u"Fibonačio seka")
app.mainloop()

Autorius: Tomas Javaišis
http://www.tru.lt

* * *
Ar jau skaitėte mano naują el.knygą "Kaip kurti web-projektus"?
Joje išdėsčiau savo dešimties metų tinklalapių kūrimo, tobulinimo ir vystymo patirtį.
Knygą galite parsisiųsti skyrelyje "Knygos".

Komentarų: 2

    Mokomės Python vartotojo sąsajos kūrimo su Tkinter moduliu | Tru.Lt:
    May 25, 2011 4:40 pm

    [...] šis straipsnis taip pat publikuojamas SkaitykIT.lt tinklaraštyje. Programavimas, Pythongui, oython, tkinter, vartotojo sąsaja ← Migruojam: us.lt -> [...]

    Martynas:
    May 26, 2011 10:13 am

    Tomai, problemos sąvoką naudoji netinkamai. Problemos negali išsikelti, gali tik ieškoti jos sprendimo, o uždavinį gali išsikelti ir išspręsti :)

Parašykite komentarą


Powered by WordPress | Designed by: BlueHost Coupon | Compare CD Rates, Online Brokers and Press Release