Canvas没有画点的函数,我们就用某一点到其右下相邻点的连线来代替。然后自定义一个函数Graph(),把给定函数f(x)在指定区间里的点 (x, f(x)) 依次画出,步进间隔小到一定程度就会连成f(x)对应的曲线。

for ... in range()的步进值只能是整数,所以引入numpy库的arange(),其步进可以是小数,例: for i in numpy.arange(0,2,0.01) # 表示区间[0,1)上步进0.01,共循环200次。

函数解析式的图像

import tkinter as tk
import pyautogui as ag
from math import *
from numpy import arange as npdef Window_Open(W, H):X, Y = ag.size()winSize = str(W)+"x"+str(H)winPos = winSize + "+" + str((X - W) // 2)winPos += "+" + str((Y - H) // 2)win.geometry(winPos)win.resizable(False, False)title = u'桌面分辨率:' + str(X) + "x" + str(Y)title += ' ' * 5 + u'窗体大小:' + winSizewin.title(title)win.update()def Graph(func,x0,y0,xmin,xmax,w,h,c='blue',step=0.001):'xmin,xmax 自变量的取值范围; c 图像颜色''x0,y0 原点坐标  w,h 横纵轴半长 step 步进'coord = x0-w,y0,x0+w,y0tCanvas.create_line(coord,fill='black')coord = x0,y0-h,x0,y0+htCanvas.create_line(coord,fill='black')w1,w2=100,120 # w1,w2为自变量和函数值在横纵轴上的放大倍数for x in np(xmin,xmax+step,step):y = func(x)coord = x0+w1*x,y0-w2*y,x0+w1*x+1,y0-w2*y+1if abs(x*w1)<w and abs(y*w2)<h:tCanvas.create_line(coord,fill=c)tCanvas.update()if __name__ == '__main__':win = tk.Tk()Window_Open(800,480)tCanvas = tk.Canvas(win, width=win.winfo_width(), height=480, bg='white')tCanvas.pack(side="top")x0,y0=400,240   # 原点坐标xmax=pi*2       # 自变量最大值,超过横坐标最大值被截短w,h=380,220     # 横纵轴的正向最大值fx1 = lambda x : sin(x)+cos(x)fx2 = lambda x : sin(x)*cos(x)gx1 = lambda x : exp(abs(x/4))-2gx2 = lambda x : (x/2)**3-2*(x/2)**2+x/2-1Graph(sin,x0,y0,-xmax,xmax,w,h)Graph(cos,x0,y0,-xmax,xmax,w,h,'red')Graph(fx1,x0,y0,-xmax,xmax,w,h,'lime')Graph(fx2,x0,y0,-xmax,xmax,w,h,'orange')Graph(gx1,x0,y0,-xmax,xmax,w,h,'magenta')Graph(gx2,x0,y0,-xmax,xmax,w,h,'limegreen')win.mainloop()

效果图:

心形曲线参数方程的图像

把Graph()函数稍作改进,就能画出参数方程对应的曲线图像,如下例:心形曲线的图像

import tkinter as tk
import pyautogui as ag
from math import *
from numpy import arange as npdef Window_Open(W, H):X, Y = ag.size()winSize = str(W)+"x"+str(H)winPos = winSize + "+" + str((X - W) // 2)winPos += "+" + str((Y - H) // 2)win.geometry(winPos)win.resizable(False, False)title = u'桌面分辨率:' + str(X) + "x" + str(Y)title += ' ' * 5 + u'窗体大小:' + winSizewin.title(title)win.update()def Graph(funcx,funcy,x0,y0,tmin,tmax,w,h,c='blue',step=0.001):'xmin,xmax 自变量的取值范围; c 图像颜色''x0,y0 原点坐标  w,h 横纵轴半长 step 步进'coord = x0-w,y0,x0+w,y0tCanvas.create_line(coord,fill='black')coord = x0,y0-h,x0,y0+htCanvas.create_line(coord,fill='black')w1,w2=100,110 # w1,w2为自变量和函数值在横纵轴上的放大倍数for t in np(tmin,tmax+step,step):x = funcx(t)y = funcy(t)coord = x0+w1*x,y0-w2*y,x0+w1*x+1,y0-w2*y+1if abs(x*w1)<w and abs(y*w2)<h:tCanvas.create_line(coord,fill=c)tCanvas.update()if __name__ == '__main__':win = tk.Tk()Window_Open(480,480)tCanvas = tk.Canvas(win, width=win.winfo_width(), height=480, bg='white')tCanvas.pack(side="top")x0,y0=240,240   # 原点坐标a = 0.7fx = lambda t : a*(2.0*sin(t)-sin(2*t))fy = lambda t : a*(1.6*cos(t)-cos(2*t))+0.5Graph(fx,fy,x0,y0,-pi,pi,220,200,c='red')win.mainloop()

效果图:

椭圆、双曲线、抛物线的图像

import tkinter as tk
import pyautogui as ag
from math import *
from numpy import arange as npdef Window_Open(W, H):X, Y = ag.size()winSize = str(W)+"x"+str(H)winPos = winSize + "+" + str((X - W) // 2)winPos += "+" + str((Y - H) // 2)win.geometry(winPos)win.resizable(False, False)title = u'桌面分辨率:' + str(X) + "x" + str(Y)title += ' ' * 5 + u'窗体大小:' + winSizewin.title(title)win.update()def Graph(funcx,funcy,x0,y0,tmin,tmax,w,h,c='blue',step=0.001):'xmin,xmax 自变量的取值范围; c 图像颜色''x0,y0 原点坐标  w,h 横纵轴半长 step 步进'coord = x0-w,y0,x0+w,y0tCanvas.create_line(coord,fill='black')coord = x0,y0-h,x0,y0+htCanvas.create_line(coord,fill='black')w1,w2=100,100 # w1,w2为自变量和函数值在横纵轴上的放大倍数for t in np(tmin,tmax+step,step):x = funcx(t)y = funcy(t)coord = x0+w1*x,y0-w2*y,x0+w1*x+1,y0-w2*y+1if abs(x*w1)<w and abs(y*w2)<h:tCanvas.create_line(coord,fill=c)tCanvas.update()if __name__ == '__main__':win = tk.Tk()Window_Open(480,480)tCanvas = tk.Canvas(win, width=win.winfo_width(), height=480, bg='white')tCanvas.pack(side="top")x0,y0=240,240a,b = 1,1.2p = 0.5f1x = lambda t : a*cos(t)f1y = lambda t : b*sin(t)f2x = lambda t : a/cos(t)f2y = lambda t : b*tan(t)f3x = lambda t : 2*p*t**2f3y = lambda t : 2*p*tGraph(f1x,f1y,x0,y0,-pi,pi,220,200)Graph(f2x,f2y,x0,y0,-pi,pi,220,200,c='red')Graph(f3x,f3y,x0,y0,-pi,pi,220,200,c='green')win.mainloop()

效果图:

附:圆锥曲线的参数方程

椭圆
x = a*cost
y = b*sint
双曲线
x = a*sect
y = b*tant
抛物线
x = 2*p*t²
y = 2*p*t

Python tkinter库之Canvas 根据函数解析式或参数方程画出图像相关推荐

  1. Python tkinter库之Canvas 直线等分圆弧(割圆术)

    直线等分圆周,分隔得越多越接近于圆: import tkinter as tk import pyautogui as ag import random from time import sleep ...

  2. python tkinter库 密码实时显示_python tkinter库实现气泡屏保和锁屏

    本文实例为大家分享了python tkinter库实现气泡屏保和锁屏的具体代码,供大家参考,具体内容如下 显示效果如下: 代码: import random import tkinter import ...

  3. python tkinter库实现华氏温度摄氏温度转换

    python tkinter库实现华氏温度摄氏温度转换 功能要求 创建GUI窗口 创建文本标签 创建可输入文本 按钮控件 创建显示文本框 温度转换函数-g 总程序 结束啦 功能要求 创建一个图形窗口, ...

  4. Python标准库:内置函数dict(mapping, **kwarg)

    Python标准库:内置函数dict(mapping, **kwarg) 本函数是从一个映射函数对象构造一个新字典. 与dict(**kwarg)函数不一样的地方是參数输入是一个映射类型的函数对象,比 ...

  5. python菜鸟教程官网绘图-Python Tkinter 画布(Canvas)

    Python Tkinter 画布(Canvas) Python Tkinter 画布(Canvas)组件和 html5 中的画布一样,都是用来绘图的.您可以将图形,文本,小部件或框架放置在画布上. ...

  6. 使用python+Tkinter库构建GUI应用工具 - 个性签名工具

    使用python+Tkinter库构建GUI应用工具 - 个性签名工具 安装Tkinter及pillow库 pip install tkinter # 安装tkinter库 pip install p ...

  7. Python实战之tkinter库画图,用canver画布教你画会动的哆啦A梦

    目录 tkinter库画图基本思路 画虚线 定义画原始人物的函数 点击眨眼 运动四肢 色彩变化 我们知道Python之所以强大,很大一方面都是因为它具有很多强大的第三方库. 而且Python很突出的一 ...

  8. python tkinter库、添加gui界面_使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)...

    使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二),创建一个,界面,布局,文件,路径 使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二) ...

  9. 树回归--python Tkinter库创建GUI(2)

    简单的Tkinter库创建GUI的例子可参考: http://blog.csdn.net/lilong117194/article/details/78456376 下面是代码: # -*- codi ...

  10. python tkinter库 pack布局方法调用

    python的tkinter库pack布局方法调用 这个布局简单 tkinter.Label(window,text='今晚去庆祝',bg="back",fg='white').p ...

最新文章

  1. 波涛汹涌的黄金甲,一碗中药引发的血案!
  2. Android中ImageView常用属性含义
  3. 青苹果一键重装系统安装VS2015
  4. Java三层结构的概念_Java中的mvc和三层结构究竟是什么关系
  5. jQuery基础 - 选择器
  6. WEB自动化测试学习进度
  7. ActivityManager: Waited long enough for: ServiceRecord 问题解决
  8. C/C++:计算N的N次方的个位数(火眼金睛找规律,解决此题数据问题)
  9. 什么是一套完全私有的即时通讯系统
  10. 树莓派4b 4G 64位系统下安装opencv
  11. 智能优化算法——粒子群算法原理(附代码)
  12. 全国人工智能师资培训班·上海站火热招生中
  13. Ubuntu下正确姿势使用GDB调试Android Native进程
  14. AEJoy —— 如何让你的 AE 插件 适应每通道 8,16,32 位颜色
  15. mysql设置定时备份
  16. 历年数学建模大赛优秀论文解读
  17. crossover卸载 linux,Mac——技巧:卸载CrossOver里的软件
  18. Spring Cloud Alibaba搭建(二):Nacos注册中心
  19. (三)MySQL的数据目录
  20. 云计算机对环境有哪些要求吗,云计算对服务器有哪些要求

热门文章

  1. 华硕计算机u盘启动不了怎么办,华硕笔记本、台式机无法从U盘启动安装系统的终极解决办法-网络教程与技术 -亦是美网络...
  2. x80hd装linux,台电X80HD:双系统切换的方法演示_台电 X80HD_平板电脑评测-中关村在线...
  3. adf4351_配置MySQL以进行ADF开发
  4. 多语言国家与缩写映射表
  5. 统一建模语言 UML
  6. java生成图表_java实现将数据生成图表至excel导出
  7. 最历害的硬盘修复工具PC3000,可重置SMART状态!
  8. android 3d桌面壁纸,五款超酷安卓手机3D桌面软件合辑推荐
  9. 模块化编程(C语言)
  10. selenium安装和chromedriver下载安装