0
点赞
收藏
分享

微信扫一扫

教你如何用python制作平面直角坐标系模拟器 python项目小发明 【安安教具】-【数学】-【平面直角坐标系】模拟器

香小蕉 2022-02-05 阅读 129

平面直角坐标系和之前的数轴模拟器有异曲同工之妙,但是作为一个二维的软件,肯定是要难一些的。。。

【安安教具】-【数学】-【数轴】模拟器 教你如何用python制作数轴模拟器 python 小项目创作_anananajiushiwo的博客-CSDN博客icon-default.png?t=M0H8https://blog.csdn.net/anananajiushiwo/article/details/122711697?spm=1001.2014.3001.5501

首先展示前端页面:

 接下来展示运行效果:

教你如何用python制作平面直角坐标系模拟器

可以看到,这回四个象限都可以锁定位置啦,而且同样横轴竖轴都会随着数值变化而变化。

首先展示前端代码:

class basedesk():#底板
    def __init__(self, master):
        self.master = master
        self.master.title("平面直角坐标系模拟器")
        self.master.configure(bg='#B1FFF9')
        self.master.geometry("1000x600")
        mainwindow(self.master)
class mainwindow():#主界面
    def __init__(self, master):
        self.master = master
        self.window = tk.Frame(self.master, bg='#e5ffe5')
        self.window.place(x=0,y=0,width=1000,height=600)
        self.window.showname_label=tk.Label(self.window,text="平面直角坐标系模拟器",fg='#26734d', bg='#ffe5ff',font=("Helvetic",60,"bold"),relief=RAISED).place(x=0, y=10,width=1000, height=150)
        self.window.enter_btn=tk.Button(self.window,text="开始",bg='#ffffe5',fg='#333399',font=("Helvetic", 60, "bold"),command=self.changetofunction).place(x=360, y=300,width=250, height=150)
    def changetofunction(self,):
        self.window.destroy()
        functionwindow(self.master)
class functionwindow():
    def __init__(self, master):
        self.master = master
        self.window = tk.Frame(self.master, bg='#e5f9ff')
        self.window.place(x=0, y=0, width=1000, height=600)
        self.init_canvas()
        self.window.input_label = tk.Label(self.master, text="请输入坐标x:", font=("Helvetic", 30, "bold"),
                                          bg='#e5f9ff').place(x=70, y=500)
        self.window.input_num= tk.Entry(self.window)
        self.window.input_num.place(x=60, y=550,width=250, height=30)
        self.window.input_label2 = tk.Label(self.master, text="请输入坐标y:", font=("Helvetic", 30, "bold"),
                                          bg='#e5f9ff').place(x=370, y=500)
        self.window.input_num2= tk.Entry(self.window)
        self.window.input_num2.place(x=360, y=550,width=250, height=30)
        self.window.enter_btn=tk.Button(self.window,text="确定",bg='#ffffe5',fg='#333399',font=("Helvetic", 60, "bold"),command=self.start).place(x=660, y=500,width=250, height=80)

初始化画布:

    def init_canvas(self):
        self.window.axis_canvas=tk.Canvas ( self.window,bg = 'white')
        self.window.axis_canvas.create_line((10, 210, 890, 210),arrow=tk.LAST)
        for i in range(21):
            self.window.axis_canvas.create_line((40+40*i, 210, 40+40*i, 200))
        self.window.axis_canvas.create_line((440, 420, 440, 10), arrow=tk.LAST)
        for i in range(21):
            self.window.axis_canvas.create_line((440,30 + 20 * i, 450, 30 + 20 * i))
        self.window.axis_canvas.place(x=50, y=50,width=900, height=430)

这部分代码的作用是绘制横轴与纵轴

绘制具体内容:

    def start(self):
        self.window.axis_canvas.destroy()
        self.init_canvas()

        num=self.window.input_num.get()#得到输入框的内容
        num2 = self.window.input_num2.get()
        #print(num)#输入的内容
        #判断是否为数字
        try:
            a=float(num)
            b=float(num2)
        except:
            messagebox.showerror('错误','请输入数字')
            return

        self.num=float(num)
        self.num2 = float(num2)
        if np.abs(self.num)>1000000000000000000000000 or np.abs(self.num2)>1000000000000000000000000:
            messagebox.showerror("错误","X_X这个数字太离谱啦!!!")
            return
        if self.num >=0:
            ruler_num=self.use_positive_axis()
        else:
            ruler_num=self.use_negative_axis()

        #插入数字并设置刻度间距
        for i in range(-10,11):
            if np.abs(self.num)>=1000000000000000000000:
                if i%5!=0 and i!=0:
                    continue
            elif np.abs(self.num)>=10000000000000000:
                if i%4!=0 and i!=0:
                    continue
            elif np.abs(self.num)>=1000000000:
                if i%3!=0 and i!=0:
                    continue
            elif np.abs(self.num)>=100000:
                if i%2==0 and i!=0:
                    continue
            self.window.axis_canvas.create_text(440+40*i,220,text=str(i*(10**ruler_num)))
        #插入指示箭头
        arrowplace=40+(10** (ruler_num+1)+self.num)*800/(10** (ruler_num+1)+10** (ruler_num+1))


        #=====================================================================================
        if self.num2 >=0:
            ruler_num2=self.use_positive_axis2()
        else:
            ruler_num2=self.use_negative_axis2()

        #插入数字并设置刻度间距
        for i in range(-10,11):
            if i==0:
                continue

            self.window.axis_canvas.create_text(460,210-20*i,text=str(i*(10**ruler_num2)))
        #插入指示箭头
        arrowplace2=410-(10** (ruler_num2+1)+self.num2)*400/(10** (ruler_num2+1)+10** (ruler_num2+1))
        self.window.axis_canvas.create_line((arrowplace, arrowplace2, arrowplace, 210), arrow=tk.LAST)
        self.window.axis_canvas.create_line((arrowplace, arrowplace2, 440, arrowplace2), arrow=tk.LAST)
        self.window.axis_canvas.create_oval((arrowplace-5, arrowplace2-5, arrowplace+5, arrowplace2+5),fill='black')

绘制横轴,纵轴的正负轴:

    def use_positive_axis(self):
        a=0
        if self.num==0:
            return 1
        while True:
            if 10**a<=self.num<10** (a+1):
                return a
            a += 1
    def use_negative_axis(self):
        a = 0
        while True:
            if 10**a<= -self.num <10** (a+1):
                return a
            a+=1
    def use_positive_axis2(self):
        a=0
        if self.num2==0:
            return 1
        while True:
            if 10**a<=self.num2<10** (a+1):
                return a
            a += 1
    def use_negative_axis2(self):
        a = 0
        while True:
            if 10**a<= -self.num2 <10** (a+1):
                return a
            a+=1

最后展示完整代码:

from tkinter import *
from tkinter import messagebox
import tkinter as tk
import numpy as np
class basedesk():#底板
    def __init__(self, master):
        self.master = master
        self.master.title("平面直角坐标系模拟器")
        self.master.configure(bg='#B1FFF9')
        self.master.geometry("1000x600")
        mainwindow(self.master)
class mainwindow():#主界面
    def __init__(self, master):
        self.master = master
        self.window = tk.Frame(self.master, bg='#e5ffe5')
        self.window.place(x=0,y=0,width=1000,height=600)
        self.window.showname_label=tk.Label(self.window,text="平面直角坐标系模拟器",fg='#26734d', bg='#ffe5ff',font=("Helvetic",60,"bold"),relief=RAISED).place(x=0, y=10,width=1000, height=150)
        self.window.enter_btn=tk.Button(self.window,text="开始",bg='#ffffe5',fg='#333399',font=("Helvetic", 60, "bold"),command=self.changetofunction).place(x=360, y=300,width=250, height=150)
    def changetofunction(self,):
        self.window.destroy()
        functionwindow(self.master)
class functionwindow():
    def __init__(self, master):
        self.master = master
        self.window = tk.Frame(self.master, bg='#e5f9ff')
        self.window.place(x=0, y=0, width=1000, height=600)
        self.init_canvas()
        self.window.input_label = tk.Label(self.master, text="请输入坐标x:", font=("Helvetic", 30, "bold"),
                                          bg='#e5f9ff').place(x=70, y=500)
        self.window.input_num= tk.Entry(self.window)
        self.window.input_num.place(x=60, y=550,width=250, height=30)
        self.window.input_label2 = tk.Label(self.master, text="请输入坐标y:", font=("Helvetic", 30, "bold"),
                                          bg='#e5f9ff').place(x=370, y=500)
        self.window.input_num2= tk.Entry(self.window)
        self.window.input_num2.place(x=360, y=550,width=250, height=30)
        self.window.enter_btn=tk.Button(self.window,text="确定",bg='#ffffe5',fg='#333399',font=("Helvetic", 60, "bold"),command=self.start).place(x=660, y=500,width=250, height=80)
    def init_canvas(self):
        self.window.axis_canvas=tk.Canvas ( self.window,bg = 'white')
        self.window.axis_canvas.create_line((10, 210, 890, 210),arrow=tk.LAST)
        for i in range(21):
            self.window.axis_canvas.create_line((40+40*i, 210, 40+40*i, 200))
        self.window.axis_canvas.create_line((440, 420, 440, 10), arrow=tk.LAST)
        for i in range(21):
            self.window.axis_canvas.create_line((440,30 + 20 * i, 450, 30 + 20 * i))
        self.window.axis_canvas.place(x=50, y=50,width=900, height=430)
    def start(self):
        self.window.axis_canvas.destroy()
        self.init_canvas()

        num=self.window.input_num.get()#得到输入框的内容
        num2 = self.window.input_num2.get()
        #print(num)#输入的内容
        #判断是否为数字
        try:
            a=float(num)
            b=float(num2)
        except:
            messagebox.showerror('错误','请输入数字')
            return
        self.num=float(num)
        self.num2 = float(num2)
        if np.abs(self.num)>1000000000000000000000000 or np.abs(self.num2)>1000000000000000000000000:
            messagebox.showerror("错误","X_X这个数字太离谱啦!!!")
            return
        if self.num >=0:
            ruler_num=self.use_positive_axis()
        else:
            ruler_num=self.use_negative_axis()
        #插入数字并设置刻度间距
        for i in range(-10,11):
            if np.abs(self.num)>=1000000000000000000000:
                if i%5!=0 and i!=0:
                    continue
            elif np.abs(self.num)>=10000000000000000:
                if i%4!=0 and i!=0:
                    continue
            elif np.abs(self.num)>=1000000000:
                if i%3!=0 and i!=0:
                    continue
            elif np.abs(self.num)>=100000:
                if i%2==0 and i!=0:
                    continue
            self.window.axis_canvas.create_text(440+40*i,220,text=str(i*(10**ruler_num)))
        #插入指示箭头
        arrowplace=40+(10** (ruler_num+1)+self.num)*800/(10** (ruler_num+1)+10** (ruler_num+1))
        #=====================================================================================
        if self.num2 >=0:
            ruler_num2=self.use_positive_axis2()
        else:
            ruler_num2=self.use_negative_axis2()

        #插入数字并设置刻度间距
        for i in range(-10,11):
            if i==0:
                continue

            self.window.axis_canvas.create_text(460,210-20*i,text=str(i*(10**ruler_num2)))
        #插入指示箭头
        arrowplace2=410-(10** (ruler_num2+1)+self.num2)*400/(10** (ruler_num2+1)+10** (ruler_num2+1))
        self.window.axis_canvas.create_line((arrowplace, arrowplace2, arrowplace, 210), arrow=tk.LAST)
        self.window.axis_canvas.create_line((arrowplace, arrowplace2, 440, arrowplace2), arrow=tk.LAST)
        self.window.axis_canvas.create_oval((arrowplace-5, arrowplace2-5, arrowplace+5, arrowplace2+5),fill='black')
    def use_positive_axis(self):
        a=0
        if self.num==0:
            return 1
        while True:
            if 10**a<=self.num<10** (a+1):
                return a
            a += 1
    def use_negative_axis(self):
        a = 0
        while True:
            if 10**a<= -self.num <10** (a+1):
                return a
            a+=1
    def use_positive_axis2(self):
        a=0
        if self.num2==0:
            return 1
        while True:
            if 10**a<=self.num2<10** (a+1):
                return a
            a += 1
    def use_negative_axis2(self):
        a = 0
        while True:
            if 10**a<= -self.num2 <10** (a+1):
                return a
            a+=1
if __name__ == '__main__':#主函数
    root = tk.Tk()
    root.resizable(False, False)
    basedesk(root)
    root.mainloop()
举报

相关推荐

0 条评论