Tyto stránky již nejsou udržovány. Obsah je postupně přesouván/aktualizován na adrese chytrosti.marrek.cz.
200/664
Obsah:
Vytvořte aplikaci pro generování grafů matematických funkcí. Aplikace bude mít tyto volby:
Uživatel vždy zadá popisky os.
#!/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
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
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
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