200/659

Graf funkce -- příklad

Obsah:

  1. Zadání
  2. Reference
  3. Kostra zdrojového kódu
  4. GUI
  5. Graf matematické funkce
  6. Graf funkce ze souboru

Zadání

Vytvořte aplikaci pro generování grafů matematických funkcí. Aplikace bude mít tyto volby:

  1. Graf matematické funkce.
    • Uživatel bude mít na výběr mezi několika funkcemi.
    • Uživatel zadává mezní hodnoty.
  2. Graf funkce z hodnot uložených v textovém souboru.

Uživatel vždy zadá popisky os.

Reference

Kostra zdrojového kódu

#!/usr/bin/python
# -*- coding: utf8 -*-

from Tkinter import *

##################################################
### Globální proměnné

##################################################
### Definice funkcí 


##################################################
### GUI
okno = Tk()


##################################################
## Nekonečná smyčka
okno.mainloop()

`--> stáhnout

GUI

Pro rozmístění udělátek je použit správce grid. Je zde 3x použit LabelFrame. Udělátka jsou umísťována do mřížky, ale uvnitř každého LabelFrame je samostatná mřížka. fceFrame je umístěn do okno a Radiobutton je umístěn do fceFrame. V tomto duchu bych mohl psát dál ...

Rád bych upozornil na metodu grid_columnconfigure. Například na řádku 15 je nastaveno, že sloupec 1 udělátka fceFrame bude vyplňovat maximální možný prostor. Potom je možné pomocí sticky=E umístit Radiobutton doprava (na východ).

sticky=W+E+N+S na řádku 21 znamená, že tlačítko má zaujmout maximální možný prostor. Parametr padx a pady udává vnitřní okraj.

Udělátka jsou většinou jen umístěny a odkazy na ně neukládám do proměnných. Je to tak proto, že komunikaci mi zajišťují Tkinterovské proměnné fceVar, fceMin, souborVar... atd.

   1 okno = Tk()
   2 okno.config(padx=10, pady=10)
   3 okno.title("Grafy funkcGrafy funkcí")
   4 ##### Matematické funkce
   5 fceVar=IntVar() # proměnná určuje výběr funkce
   6 fceMin=StringVar()
   7 fceMax=StringVar()
   8 fceFrame = LabelFrame(okno, text="Graf matematické funkce", padx=5, pady=5)
   9 fceFrame.grid(column=0, row=0, sticky=W+E )
  10 
  11 Radiobutton(fceFrame,text="sin" , variable=fceVar, value=0).grid(column=0, row=0,sticky=W)
  12 Radiobutton(fceFrame,text="log" , variable=fceVar, value=1).grid(column=0, row=1)
  13 Radiobutton(fceFrame,text="exp" , variable=fceVar, value=2).grid(column=0, row=2)
  14 
  15 fceFrame.grid_columnconfigure(1, weight=1)
  16 fceMin.set('Od')
  17 fceMax.set('Do')
  18 Entry(fceFrame, textvariable=fceMin, width=7).grid(column=1, row=0, sticky=E)
  19 Entry(fceFrame, textvariable=fceMax, width=7).grid(column=1, row=1, sticky=E)
  20 
  21 Button(okno, text="Vytvoř graf").grid(column=1, row=0, sticky=W+E+N+S)
  22 
  23 ##### graf ze souboru
  24 souborVar = StringVar() # jméno souboru
  25 souborFrame = LabelFrame(okno, text="Graf funkce ze souboru", padx=5, pady=5)
  26 souborFrame.grid(column=0, row=1, sticky=W+E)
  27 
  28 souborFrame.grid_columnconfigure(0, weight=1)
  29 
  30 souborVar.set('/cesta/k/souboru')
  31 Entry(souborFrame,  textvariable=souborVar).grid(sticky=W)
  32 Button(souborFrame,  text='Vyber soubor').grid(sticky=E)
  33 
  34 Button(okno, text="Vytvoř graf").grid(column=1, row=1, sticky=W+E+N+S)
  35 
  36 ##### popisky os
  37 
  38 osyFrame = LabelFrame(okno, text="Popisky os", padx=5, pady=5, width=10)
  39 osyFrame.grid(column=0, row=2, sticky=W+E )
  40 
  41 Label(osyFrame, text='osa X').grid()
  42 Label(osyFrame, text='osa Y').grid()
  43 
  44 osaxVar= StringVar()
  45 osayVar= StringVar()
  46 Entry(osyFrame, textvariable=osaxVar, width=15).grid(column=1, row=0)
  47 Entry(osyFrame, textvariable=osayVar, width=15).grid(column=1, row=1)

`--> stáhnout

Graf matematické funkce

Python má k dispozici úžasnou knihovnu MatPlotLib, která udělá skoro vše za nás. Stačí knihovnu importovat

import pylab as lab

`--> stáhnout

a pak už si jen užívat... Jen je třeba importovat část Tkinter, která má na starosti dialogy.

import tkMessageBox as box

`--> stáhnout

def fceGraf():
    try:
        od=float( fceMin.get())
        do=float( fceMax.get())
        x=lab.linspace(od, do, 500)
        if fceVar.get() == 0:
            y=lab.sin(x)
        elif fceVar.get() == 1:
            y=lab.log10(x)
        elif fceVar.get() == 2:
            y=lab.exp(x)
        lab.figure()
        lab.plot(x,y)
        lab.xlabel(osaxVar.get())
        lab.ylabel(osayVar.get())
        lab.grid(True)
        lab.show()
    except:
        box.showerror(title='Chybné meze', message='Zadejte meze osy X\njako reálná čísla')

`--> stáhnout

Graf funkce ze souboru

Nejprve uživateli umožníme vybrat si na disku soubor. Dialogy pro výběr souboru je třeba importovat zvlášť: tkFileDialog, tkFileDialog_

import tkFileDialog as fdialog

`--> stáhnout

def vyberSoubor():
    cesta= fdialog.askopenfilename(title='Vyberte soubor')    
    if cesta != '':
        souborVar.set(cesta)

`--> stáhnout

Následuje čtení souboru. Zpracování se děje po řádcích. Vždy řádek rozdělím pomocí .split() a čísla přidám do seznamů x a y.

def fceSoubor():
    try:
        cesta = souborVar.get()
        f = open(cesta,'r')
        x=[]
        y=[]
        while 1:
            radek=f.readline()
            if radek=='':
                break
            cisla=radek.split()
            x.append( float(cisla[0]) )
            y.append( float(cisla[1]) )
        f.close()
        lab.figure()
        lab.plot(x,y)
        lab.xlabel(osaxVar.get())
        lab.ylabel(osayVar.get())
        lab.grid(True)
        lab.show()
    except:
        box.showerror(title='Chybný formát souboru', 
                message='Graf se nepodařilo vytvořit,\nzkontrolujte fomát souboru.')

`--> stáhnout

| navigace |

Licence Creative Commons Valid XHTML 1.0 Strict Valid CSS! Antispam.er.cz Blog: Tlapicka.net