鱼C论坛

 找回密码
 立即注册
查看: 2605|回复: 4

本人新手,在用tkinter模块绘制界面时遇到问题,求大神相助

[复制链接]
发表于 2017-4-19 23:06:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
# coding:utf-8
from tkinter import *
import numpy as np
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure

stye = 1

def draw_pic():
    """
    获取GUI界面设置的参数,利用该参数绘制图片
    """
    global stye
    # 获取GUI界面上的参数
    try:
        samplepoint_x = int(inputentry_x.get())
        samplepoint_y = int(inputentry_y.get())
        accurate_unit = float(inputentry_straight_unit.get())
       # accurate_unit2 = float(inputentry_circle_unit.get())
        ####################################################
        circle_r = int(inputentry_r.get())
    except:
        samplepoint_x = 5
        samplepoint_y = 10
        print('请输入整数')
        inputentry_x.delete(0, END)
        inputentry_x.insert(0, '5')
        inputentry_y.delete(0, END)
        inputentry_y.insert(0, '10')
        ############################################
        circle_r = 5
        print('请输入整数')
        inputentry_r.delete(0, END)
        inputentry_r.insert(0, '5')

    # 清空图像,以使得前后两次绘制的图像不会重叠
    draw_pic.f.clf()
    draw_pic.a = draw_pic.f.add_subplot(121)
    draw_pic.b = draw_pic.f.add_subplot(122)

    if stye == 0:
        ############################################################
        # global accurate_unit
        # 在[0,]范围内生成等距的1000个数据点
        slope = samplepoint_y / samplepoint_x
        x_axis = np.linspace(0, samplepoint_x, 1000)
        # y = np.sqrt(4 - x ** 2)
        y_axis = (slope * x_axis)
        # color = ['b', 'r', 'y', 'g']

        # 生成折线点
        step_point_x = [0]
        step_point_y = [0]
        x = 0
        y = 0
        all_step = int((samplepoint_x + samplepoint_y) / accurate_unit)
        for i in range(0, all_step):
            v = y * samplepoint_x - x * samplepoint_y
            if v >= 0:
                x += accurate_unit
            if v < 0:
                y += accurate_unit
            step_point_x.append(x)
            step_point_y.append(y)
    if stye == 1:
        ####################################################################
        # global accurate_unit
        # 在[0,]范围内生成等距的1000个数据点
        x_axis = np.linspace(0, circle_r, 1000)
        # y = np.sqrt(4 - x ** 2)
        y_axis = np.sqrt(circle_r**2 - x_axis ** 2)
        # color = ['b', 'r', 'y', 'g']

        # 生成折线点
        step_point_x = [circle_r]
        step_point_y = [0]
        x = circle_r
        y = 0
        all_step = int(2*circle_r / accurate_unit)
        v = 0
        for i in range(0, all_step):
            if v >= 0:
                v = v - 2 * x + accurate_unit
                x -= accurate_unit
            if v < 0:
                v = v + 2 * y + accurate_unit
                y += accurate_unit
            step_point_x.append(x)
            step_point_y.append(y)
        ######################################################


    # 绘制正比例函数
    draw_pic.a.plot(x_axis, y_axis, color='r')
    draw_pic.b.plot(step_point_x, step_point_y, color='b')
    axis_lim = max(samplepoint_x, samplepoint_y)
    # draw_pic.a.set_xticks(np.linspace(0, axis_lim, axis_lim))
    # draw_pic.a.set_xticklabels(np.linspace(0, axis_lim, axis_lim))
    draw_pic.a.set_xlim(0, axis_lim)
    draw_pic.a.set_ylim(0, axis_lim)
    draw_pic.b.set_xlim(0, axis_lim)
    draw_pic.b.set_ylim(0, axis_lim)
    draw_pic.a.set_title('Straight_line')
    draw_pic.canvas.show()

#def choise_type():

if __name__ == '__main__':
    matplotlib.use('TkAgg')
    root = Tk()

    # 在Tk的GUI上放置一个画布,并用.grid()来调整布局
    draw_pic.f = Figure(figsize=(8, 4), dpi=100)
    draw_pic.canvas = FigureCanvasTkAgg(draw_pic.f, master=root)
    draw_pic.canvas.show()
    draw_pic.canvas.get_tk_widget().grid(row=0, columnspan=3)

    inputentry_x = Entry(root)
    inputentry_y = Entry(root)
    inputentry_straight_unit = Entry(root)
    inputentry_r = Entry(root)
    #inputentry_circle_unit = Entry(root)
    Label(root, text='插补分辨率:').grid(row=2, column=0)
    inputentry_straight_unit.grid(row=2, column=1, columnspan=2)
    inputentry_straight_unit.insert(0, '0.1')


    def straight():
        global stye
        stye = 0
        # 放置标签、文本框和按钮等部件,并设置文本框的默认值和按钮的事件函数
        Label(root, text='请输入终点坐标:').grid(row=1, column=0)
        inputentry_x.grid(row=1, column=1)
        inputentry_x.insert(0, '5')
        inputentry_y.grid(row=1, column=2)
        inputentry_y.insert(0, '5')
        Button(root, text='画图', command=draw_pic).grid(row=2, column=2, columnspan=3)


    def circle():
        global stye
        stye = 1
        # 放置标签、文本框和按钮等部件,并设置文本框的默认值和按钮的事件函数
        Label(root, text='请输入圆弧半径:').grid(row=1, column=0)
        inputentry_r.grid(row=1, column=1)
        inputentry_r.insert(0, '5')
        Label(root, text='插补分辨率:').grid(row=2, column=0)
        Button(root, text='画图', command=draw_pic).grid(row=2, column=2, columnspan=3)

        #Label(root, text='插补分辨率:').grid(row=2, column=0)
        #inputentry_circle_unit.grid(row=2, column=1, columnspan=2)
        #inputentry_circle_unit.insert(0, '0.5')
        #Button(root, text='画图', command=draw_pic).grid(row=2, column=2, columnspan=3)

    # 显示选择按钮
    Button(root, text='直线', command=straight).grid(row=3, column=0, columnspan=2)
    Button(root, text='圆弧', command=circle).grid(row=3, column=1, columnspan=2)

    # 启动事件循环
    root.mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-4-19 23:08:00 | 显示全部楼层
运行程序后,先点击“圆弧”按钮,再点击“画图”按钮时会报错:local variable 'accurate_unit' referenced before assignment
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-19 23:17:13 | 显示全部楼层
本帖最后由 ooxx7788 于 2017-4-19 23:28 编辑

已经QQ回答你了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-20 08:30:11 | 显示全部楼层
# global accurate_unit

#删除
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-20 12:12:00 | 显示全部楼层
SixPy 发表于 2017-4-20 08:30
# global accurate_unit

把#删除

还是一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-2-12 15:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表