首页 > 编程语言 >python: Drawing Canvas

python: Drawing Canvas

时间:2023-09-29 09:15:00浏览次数:27  
标签:Canvas wdraw python text self canvas param drawing Drawing

 

# encoding: utf-8
# 版权所有 2023 涂聚文有限公司
# 许可信息查看:
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 311
# Datetime  : 2023/9/21 21:28
# User      : geovindu
# Product   : PyCharm
# Project   : EssentialAlgorithms
# File      : DrawingTwo.py
# explain   : 学习

import tkinter as tk
import tkinter.font as tk_font
import math

class DrawingCanvasTwo(object):
    """
    A canvas drawing manager.

    """
    def __init__(self, canvas, wxmin, wymin, wxmax, wymax, dmargin, y_is_flipped):
        """

        :param canvas:
        :param wxmin:
        :param wymin:
        :param wxmax:
        :param wymax:
        :param dmargin:
        :param y_is_flipped:
        """
        self.canvas = canvas
        self.wxmin = wxmin
        self.wymin = wymin
        self.wxmax = wxmax
        self.wymax = wymax
        self.dmargin = dmargin
        self.y_is_flipped = y_is_flipped

        self.set_scales()

    def set_scales(self):
        """
        Calculate scale parameters for the canvas's current size.
        :return:
        """
        self.canvas.update()
        self.dxmin = self.dmargin
        self.dymin = self.dmargin
        self.dxmax = self.canvas.winfo_width() - self.dmargin - 1
        self.dymax = self.canvas.winfo_height() - self.dmargin - 1

        # Flip the Y coordinates to invert the result.
        if self.y_is_flipped:
            self.dymin, self.dymax = self.dymax, self.dymin

        self.xscale = (self.dxmax - self.dxmin) / (self.wxmax - self.wxmin)
        self.yscale = (self.dymax - self.dymin) / (self.wymax - self.wymin)

        # Calculate 1 pixel in world coordinates.
        self.xpix = 1 / self.xscale
        self.ypix = 1 / self.yscale

    def w_to_d(self, wx, wy):
        """
        Map a point from world to device coordinates.
        :param wx:
        :param wy:
        :return:
        """
        dx = (wx - self.wxmin) * self.xscale + self.dxmin
        dy = (wy - self.wymin) * self.yscale + self.dymin
        return dx, dy

    def clear(self):
        """

        :return:
        """

        self.canvas.delete(tk.ALL)

    def wdraw_line(self, wx0, wy0, wx1, wy1, color, arrow):
        """
        Draw a line in world coordinates.
        :param wx0:
        :param wy0:
        :param wx1:
        :param wy1:
        :param color:
        :param arrow:
        :return:
        """
        dx0, dy0 = self.w_to_d(wx0, wy0)
        dx1, dy1 = self.w_to_d(wx1, wy1)
        self.canvas.create_line(dx0, dy0, dx1, dy1, fill=color, arrow=arrow)

    def wdraw_axes(self, xtic_spacing, ytic_spacing, tic_hgt, tic_wid, do_draw_text, color):
        """
        Draw coordinate axes.
        :param xtic_spacing:
        :param ytic_spacing:
        :param tic_hgt:
        :param tic_wid:
        :param do_draw_text:
        :param color:
        :return:
        """
        self.wdraw_line(self.wxmin, 0, self.wxmax, 0, color, arrow=tk.BOTH)
        self.wdraw_line(0, self.wymin, 0, self.wymax, color, arrow=tk.BOTH)

        startx = xtic_spacing * int((self.wxmin + xtic_spacing) / xtic_spacing)
        x = startx
        while x < self.wxmax:
            if (abs(x) > 0.01):
                dx0, dy0 = self.w_to_d(x, tic_hgt)
                dx1, dy1 = self.w_to_d(x, -tic_hgt)
                self.canvas.create_line(dx0, dy0, dx1, dy1, fill=color)
                if do_draw_text:
                    self.canvas.create_text(dx1, dy1, text=str(x), fill=color, anchor=tk.N)
            x += xtic_spacing

        starty = ytic_spacing * int((self.wymin + ytic_spacing) / ytic_spacing)
        y = starty
        while y < self.wymax:
            if (abs(y) > 0.01):
                dx0, dy0 = self.w_to_d(tic_wid, y)
                dx1, dy1 = self.w_to_d(-tic_wid, y)
                self.canvas.create_line(dx0, dy0, dx1, dy1, fill=color)
                if do_draw_text:
                    self.canvas.create_text(dx1, dy1, text=str(y), fill=color, anchor=tk.E)
            y += ytic_spacing

    def wdraw_polyline(self, wcoords, color):
        """
        Draw a connected series of points in world coordinates.
        :param wcoords:
        :param color:
        :return:
        """

        dpoints = []
        for i in range(0, len(wcoords), 2):
            dpoints += self.w_to_d(wcoords[i], wcoords[i+1])
        self.canvas.create_line(dpoints, fill=color)

    def wdraw_rotated_text(self, wx, wy, text, angle, color, font):
        """
        Draw a rotated text at the indicated position in world coordinates.
        :param wx:
        :param wy:
        :param text:
        :param angle:
        :param color:
        :param font:
        :return:
        """
        dx, dy = self.w_to_d(wx, wy)
        self.canvas.create_text(dx, dy, text=text, angle=angle, fill=color, font=font)

    def wdraw_function(self, func, color, wxmin, wxmax, step_x):
        """
        Draw a function.
        :param func:
        :param color:
        :param wxmin:
        :param wxmax:
        :param step_x:
        :return:
        """
        points = []
        x = wxmin
        while x <= wxmax:
            points.append(x)
            points.append(func(x))
            x += step_x
        self.wdraw_polyline(points, color)


def log_x(x):
    """

    :param x:
    :return:
    """
    return math.log(x, 2)
def sqrt_x(x):
    """

    :param x:
    :return:
    """
    return 1.5 * math.sqrt(x)
def identity_x(x):
    """

    :param x:
    :return:
    """
    return x
def x2(x):
    """

    :param x:
    :return:
    """
    return x * x / 5
def two_to_the_x(x):
    """

    :param x:
    :return:
    """
    return math.pow(2, x) / 10
def factorial_n(n):
    """

    :param n:
    :return:
    """
    result = 1
    for i in range(2, n + 1):
        result *= i
    return result / 100
def fibonacci_n(n):
    """

    :param n:
    :return:
    """
    if n == 0:
        return 0
    fib_minus2 = 0
    fib_minus1 = 1
    fib = 1
    for i in range(2, n + 1):
        fib = fib_minus1 + fib_minus2
        fib_minus2 = fib_minus1
        fib_minus1 = fib
    return fib / 10

  

# encoding: utf-8
# 版权所有 2023 涂聚文有限公司
# 许可信息查看:
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 311
# Datetime  : 2023/9/21 21:29
# User      : geovindu
# Product   : PyCharm
# Project   : EssentialAlgorithms
# File      : Chapter03.py
# explain   : 学习

import tkinter as tk
import tkinter.font as tk_font
import math
import ChapterOne.DrawingTwo

class Ch03App(object):
    """

    """
    def __init__(self):
        """

        """
        self.window = tk.Tk()
        self.window.title("runtime_functions")
        self.window.protocol("WM_DELETE_WINDOW", self.kill_callback)
        self.window.geometry("570x570")

        # Make a slightly bigger label font.
        self.label_font = tk_font.Font(family="Times New Roman", size=14)

        # Canvas.
        self.canvas = tk.Canvas(self.window, width=550, height=550,
            relief=tk.RIDGE, bd=5, highlightthickness=0, bg="white")
        self.canvas.xview("moveto", 5)   # Move out from the border.
        self.canvas.yview("moveto", 5)
        self.canvas.grid(row=1, column=0, columnspan=4, padx=5, pady=5)

        # Make the DrawingCanvas.
        self.drawing_canvas = ChapterOne.DrawingTwo.DrawingCanvasTwo(self.canvas, -1, -1, 21, 21, 20, True)

        # Draw the scene.
        self.draw_scene()

        # Force focus so Alt+F4 closes this window and not the Python shell.
        self.window.focus_force()
        self.window.mainloop()

    def kill_callback(self):
        """

        :return:
        """

        self.window.destroy()

    def draw_scene(self):
        """
        Draw the scene."
        :return: 
        """
        self.drawing_canvas.clear()

        # Draw the curves.
        wxmin = self.drawing_canvas.wxmin
        wxmax = self.drawing_canvas.wxmax
        xpix = self.drawing_canvas.xpix
        self.drawing_canvas.wdraw_function(ChapterOne.DrawingTwo.log_x, "blue", 0.5, wxmax, xpix)
        self.drawing_canvas.wdraw_function(ChapterOne.DrawingTwo.sqrt_x, "green", 0, wxmax, xpix)
        self.drawing_canvas.wdraw_function(ChapterOne.DrawingTwo.identity_x, "black", 0, wxmax, xpix)
        self.drawing_canvas.wdraw_function(ChapterOne.DrawingTwo.x2, "orange", 0, wxmax, xpix)
        self.drawing_canvas.wdraw_function(ChapterOne.DrawingTwo.two_to_the_x, "magenta", 0, wxmax, xpix)
        self.drawing_canvas.wdraw_function(ChapterOne.DrawingTwo.fibonacci_n, "blue", 0, 20, 1)
        self.drawing_canvas.wdraw_function(ChapterOne.DrawingTwo.factorial_n, "red", 0, 10, 1)

        self.drawing_canvas.wdraw_rotated_text(15, 4.5, "y = Log(x)", 6, "blue", self.label_font)
        self.drawing_canvas.wdraw_rotated_text(15, 6.5, "y = 1.5 * Sqrt(x)", 11, "green", self.label_font)
        self.drawing_canvas.wdraw_rotated_text(13, 14, "y = x", 45, "black", self.label_font)
        self.drawing_canvas.wdraw_rotated_text(8.75, 17, "y = x^2 / 5", 75, "orange", self.label_font)
        self.drawing_canvas.wdraw_rotated_text(7, 17.5, "y = 2x / 10", 85, "magenta", self.label_font)
        self.drawing_canvas.wdraw_rotated_text(5.5, 18, "y = x! / 100", 88, "red", self.label_font)
        self.drawing_canvas.wdraw_rotated_text(11.5, 16, "y = Fibonacci(x) / 10", 83, "blue", self.label_font)

        # Draw the axes.
        self.drawing_canvas.wdraw_axes(5, 5, 0.2, 0.2, True, "gray")

  

调用:

    BLL.ChapterIExample.ChapExample.CharIII()

  

输出:

 

标签:Canvas,wdraw,python,text,self,canvas,param,drawing,Drawing
From: https://www.cnblogs.com/geovindu/p/17736754.html

相关文章

  • python基础:python命令行选项
    一前言安装完python后,通过python关键字我们就可以执行python文件如下pythonxxx.py上面是很常见的在命令行执行py的方式,但其实python关键字后面还可以加上许多可选选项如python-cxxxxxpython-mxxxxx二python关键字后的可选选项python[-bBdEhiIOqsSuvVWx?][-ccom......
  • Mac部署Python语言json模块(Anaconda)
      本文介绍在Mac电脑的Anaconda环境中,配置Python语言中,用以编码、解码、处理JSON数据的json库的方法;在Windows电脑中配置json库的方法也是类似的,大家可以一并参考。  JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,常用于数据的序列化和传输。而Python中的json库,......
  • 结对项目:python开发四则运算的程序
    项目链接软件工程软件工程链接作业要求作业要求的链接作业目标两人用python实现一个自动生成小学四则运算题目的命令行程序github项目链接github项目链接团队成员姓名学号李金强3121004868赵继业31210048901.PSP表格PSP表格通常用......
  • Python语言特色与版本演进
    1.2.1Python的优点1.集成性Python最令人无法拒绝的优点是开发效率高,这主要归功于其本身具有高度的集成性。Python除了本身具有功能丰富的标准库外,使用他人写好的第三方库也十分方便。2.优雅美观Python使用缩进表征代码段的逻辑结构,而不是使用大括号,这一优点极大地增......
  • 编写运行一个Python程序
    1.5.1基于PythonIDLE运行程序(1)找到安装Python所在的目录。(2)进入子目录./Lib/idlelib。(3)找到并双击idle.bat文件,会弹出idle窗口(此时即表示已进入PythonShell)。1.5.2命令行式交互运行文件(1)打开文本编辑器(如Notepad),编写代码并保存为helloworld.py文件。(2)打开cmd......
  • Python与大数据概述
    1.1.1Python概述Python是一种条理清晰、语法优美的面向对象型程序设计语言,同时,它也是一门解释型的高级语言。Python的设计哲学强调代码的可读性和语法的简洁(尤其是使用空格缩进划分代码块,而非使用大括号或者关键词)。1.1.2Python的设计哲学——Python之禅Python的设......
  • 编程基础与Python的开发模式
    1.3.1程序设计的概念1.逻辑设计(1)过程的起点是分析并确定需求。(2)从现实中抽象。(3)抽象过后是设计算法。2.程序设计(1)选择编程语言。(2)设计数据结构。(3)设计业务逻辑。(4)选择开发模式。1.3.2程序的生命周期(1)硬件部分。(2)操作系统。(3)汇编语言。(4)高级语言。(5)应......
  • Python解释器和集成开发环境的安装及使用
    1.4.1安装前的注意事项1.Python版本选择Python语言使用者分为Python2和Python3两大阵营。两种版本在部分语法和标准库函数的用法上会有差别,两个版本相互是不兼容的。因此,读者首先需要确定需要使用的Python版本。2.操作系统位数(1)支持的内存不同:32位OS最多支持4GB内存,......
  • Python标准库分享之时间与日期 (time, datetime包)
    Python具有良好的时间和日期管理功能。实际上,计算机只会维护一个挂钟时间(wallclocktime),这个时间是从某个固定时间起点到现在的时间间隔。时间起点的选择与计算机相关,但一台计算机的话,这一时间起点是固定的。其它的日期信息都是从这一时间计算得到的。此外,计算机还可以测量CPU实......
  • 结对项目:用Python实现自动生成小学四则运算题目的程序
    Python实现四则运算程序软件工程计科21级1.2班作业要求https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13016作业目标完成结对项目:四则运算;熟悉团队协作的方法和模式github链接:https://github.com/howdnb/howdnb项目成员信息姓名学号......