鱼C论坛

 找回密码
 立即注册
查看: 219|回复: 1

[已解决]求助

[复制链接]
发表于 2024-5-13 12:21:37 | 显示全部楼层 |阅读模式

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

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

x
凸轮设计加交互界面,但是我的变量都是空值


import tkinter as tk
import math
import turtle as t
h, a1, a2, a3, a4, e, r0, rr = None, None, None, None, None, None, None, None

def on_submit_button_click():
    # 读取Entry控件的值
    h_value = h_entry.get()
    a1_value = a1_entry.get()
    a2_value = a2_entry.get()
    a3_value = a3_entry.get()
    a4_value = a4_entry.get()
    e_value = e_entry.get()
    r0_value = r0_entry.get()
    rr_value = rr_entry.get()

    # 将读取的值转换为适当的类型(如果需要的话)
    # 例如,如果变量应该是整数或浮点数
    try:
        h = int(h_value) if h_value.isdigit() else float(h_value)
        a1 = int(a1_value) if a1_value.isdigit() else float(a1_value)
        a2 = int(a2_value) if a2_value.isdigit() else float(a2_value)
        a3 = int(a3_value) if a3_value.isdigit() else float(a3_value)
        a4 = int(a4_value) if a4_value.isdigit() else float(a4_value)
        e = int(e_value) if e_value.isdigit() else float(e_value)
        r0 = int(r0_value) if r0_value.isdigit() else float(r0_value)
        rr = int(rr_value) if rr_value.isdigit() else float(rr_value)
    except ValueError:
        print("输入值必须为数字!")
        return

        # 在这里可以使用这些变量进行进一步的处理



# 创建主窗口
root = tk.Tk()
root.title("变量赋值界面")

# 创建Entry控件和标签
labels = ["h", "a1", "a2", "a3", "a4", "e", "r0", "rr"]
entries = []
for label in labels:
    tk.Label(root, text=label + ":").pack()
    entry = tk.Entry(root)
    entry.pack()
    entries.append(entry)

# 将Entry控件的引用存储到全局变量中以便在回调函数中访问
h_entry, a1_entry, a2_entry, a3_entry, a4_entry, e_entry, r0_entry, rr_entry = entries

# 创建一个提交按钮
submit_button = tk.Button(root, text="提交", command=on_submit_button_click)
submit_button.pack()

# 开始Tkinter事件循环
root.mainloop()
print(h, a1, a2, a3, a4, e, r0, rr)
ph_g = math.radians(a2-a1)
ph_b = math.radians(a4-a3)
angle1=[]
for i in range(240):#每1.5度求解
    angle1.append(i*1.5)
s_law = []
for i in range(len(angle1)):
    angle_1 = angle1[i]
    if angle_1 >= 0 and angle_1 < 45:
        s_law.append(0)
    elif angle_1 >= 45 and angle_1 < 210:
        s = h/2*(1-math.cos(math.pi/ph_g*math.radians(angle_1-45)))
        s_law.append(s)
    elif  angle_1 >= 210 and angle_1 < 260:
        s_law.append(30)
    else:
        s = h-h/ph_b*math.radians(angle_1-260)+h/(2*math.pi)*math.sin(2*math.pi/ph_b*math.radians(angle_1-260))
        s_law.append(s)
x0 = []
y0 = []
s0 = math.sqrt(r0**2-e**2)
for i in range(len(angle1)):
    x0.append((s0 + s_law[i])*math.sin(math.radians(angle1[i])) + e*math.cos(math.radians(angle1[i])))
    y0.append((s0 + s_law[i])*math.cos(math.radians(angle1[i])) - e*math.sin(math.radians(angle1[i])))


#实际轮廓曲线计算
xa = []
ya = []
dx_dph = []
dy_dph = []
for i in range(len(angle1)):#求导数
    angle_1 = angle1[i]
    if angle_1 >= 0 and angle_1 < 45:
        ds_dph = 0
        dx_dph.append(y0[i]+ds_dph*math.sin(math.radians(angle_1)))
        dy_dph.append(-x0[i]+ds_dph*math.cos(math.radians(angle_1)))
    elif angle_1 >= 45 and angle_1 < 210:
        ds_dph = h/(2*ph_g)*math.sin(math.pi/ph_g*math.radians(angle_1-45))
        dx_dph.append(y0[i]+ds_dph*math.sin(math.radians(angle_1)))
        dy_dph.append(-x0[i]+ds_dph*math.cos(math.radians(angle_1)))
    elif  angle_1 >= 210 and angle_1 < 260:
        ds_dph = 0
        dx_dph.append(y0[i]+ds_dph*math.sin(math.radians(angle_1)))
        dy_dph.append(-x0[i]+ds_dph*math.cos(math.radians(angle_1)))
    else:
        ds_dph = -h/ph_b + h/ph_b * math.cos(2*math.pi/ph_b*math.radians(angle_1-260))
        dx_dph.append(y0[i]+ds_dph*math.sin(math.radians(angle_1)))
        dy_dph.append(-x0[i]+ds_dph*math.cos(math.radians(angle_1)))
for i in range(len(angle1)):
    cos0 = -dy_dph[i]/math.sqrt(dx_dph[i]**2+dy_dph[i]**2)
    xa.append(x0[i] - rr*cos0 )
    sin0 = dx_dph[i]/math.sqrt(dx_dph[i]**2+dy_dph[i]**2)
    ya.append(y0[i] - rr*sin0)


t.hideturtle ()
t.speed ("fastest")
#直角坐标系
t.color('red')
t.penup()
t.goto(-500,0)
t.pendown()
t.goto(500,0)
t.penup()
t.goto(0,-500)
t.pendown()
t.goto(0,500)
#基圆
t.color('black')
t.penup()
t.goto(0,-r0*5)
t.pendown()
t.circle(r0*5)
#理论轮廓曲线
t.penup()
t.color('blue')
t.goto(5*x0[0],5*y0[0])
t.pendown()
for i in range(len(angle1)):
    t.goto(5*x0[i],5*y0[i])
t.goto(5*x0[0],5*y0[0])
#实际轮廓曲线
t.width(2)
t.penup()
t.goto(5*xa[0],5*ya[0])
t.pendown()
t.color('black')
for i in range(len(angle1)):
    t.goto(5*xa[i],5*ya[i])
t.goto(5*xa[0],5*ya[0])
#关闭
t.done()


最佳答案
2024-5-13 12:22:31
你好,看起来你的代码存在一些问题。首先,在提交按钮的回调函数中,你没有在函数内部对全局变量进行操作,而是创建了同名的局部变量来保存读取到的值。所以在函数外部打印输出的时候,仍然会打印出空值。你可以在函数内部使用`global`关键字来声明这些变量是全局变量,这样就可以在函数内部对它们进行赋值了。

其次,在计算理论轮廓曲线和实际轮廓曲线的部分,你使用了列表作为迭代对象,但在循环内部对列表元素进行操作的时候,并没有使用索引来指定具体的元素。也就是说,你的代码中的`angle1`、`x0`、`y0`、`dx_dph`、`dy_dph`等都应该写成`angle1[i]`、`x0[i]`、`y0[i]`、`dx_dph[i]`、`dy_dph[i]`等。

另外,你在计算理论轮廓曲线时,使用了未定义的变量`s_law`,你可以在函数内部定义一个空列表`s_law`,然后在`if-elif-else`语句块中添加元素。

最后,在绘制轮廓曲线的代码中,你需要使用循环来依次绘制每个点,而不是直接使用列表。你可以改成使用`range`函数生成索引来遍历`angle1`、`xa`和`ya`列表,然后在循环中使用索引来获取每个点的坐标。

根据上述修改,你可以改进你的代码如下:
import tkinter as tk
import math
import turtle as t

# 创建提交按钮的回调函数
def on_submit_button_click():
    global h, a1, a2, a3, a4, e, r0, rr  # 声明变量是全局变量

    # 读取Entry控件的值
    h_value = h_entry.get()
    a1_value = a1_entry.get()
    a2_value = a2_entry.get()
    a3_value = a3_entry.get()
    a4_value = a4_entry.get()
    e_value = e_entry.get()
    r0_value = r0_entry.get()
    rr_value = rr_entry.get()

    # 将读取的值转换为适当的类型(如果需要的话)
    # 例如,如果变量应该是整数或浮点数
    try:
        h = int(h_value) if h_value.isdigit() else float(h_value)
        a1 = int(a1_value) if a1_value.isdigit() else float(a1_value)
        a2 = int(a2_value) if a2_value.isdigit() else float(a2_value)
        a3 = int(a3_value) if a3_value.isdigit() else float(a3_value)
        a4 = int(a4_value) if a4_value.isdigit() else float(a4_value)
        e = int(e_value) if e_value.isdigit() else float(e_value)
        r0 = int(r0_value) if r0_value.isdigit() else float(r0_value)
        rr = int(rr_value) if rr_value.isdigit() else float(rr_value)
    except ValueError:
        print("输入值必须为数字!")
        return

    # 在这里可以使用这些变量进行进一步的处理
    # ...

# 创建主窗口
root = tk.Tk()
root.title("变量赋值界面")

# 创建Entry控件和标签
labels = ['h', 'a1', 'a2', 'a3', 'a4', 'e', 'r0', 'rr']
entries = []
for label in labels:
    tk.Label(root, text=label + ":").pack()
    entry = tk.Entry(root)
    entry.pack()
    entries.append(entry)

# 将Entry控件的引用存储到全局变量中以便在回调函数中访问
h_entry, a1_entry, a2_entry, a3_entry, a4_entry, e_entry, r0_entry, rr_entry = entries

# 创建一个提交按钮
submit_button = tk.Button(root, text="提交", command=on_submit_button_click)
submit_button.pack()

# 开始Tkinter事件循环
root.mainloop()
print(h, a1, a2, a3, a4, e, r0, rr)

ph_g = math.radians(a2 - a1)
ph_b = math.radians(a4 - a3)
angle1 = []
for i in range(240):  # 每1.5度求解
    angle1.append(i * 1.5)

s_law = []
for i in range(len(angle1)):
    angle_1 = angle1[i]
    if angle_1 >= 0 and angle_1 < 45:
        s_law.append(0)
    elif angle_1 >= 45 and angle_1 < 210:
        s = h / 2 * (1 - math.cos(math.pi / ph_g * math.radians(angle_1 - 45)))
        s_law.append(s)
    elif angle_1 >= 210 and angle_1 < 260:
        s_law.append(30)
    else:
        s = h - h / ph_b * math.radians(angle_1 - 260) + h / (2 * math.pi) * math.sin(
            2 * math.pi / ph_b * math.radians(angle_1 - 260))
        s_law.append(s)

x0 = []
y0 = []
s0 = math.sqrt(r0 ** 2 - e ** 2)
for i in range(len(angle1)):
    x0.append((s0 + s_law[i]) * math.sin(math.radians(angle1[i])) + e * math.cos(math.radians(angle1[i])))
    y0.append((s0 + s_law[i]) * math.cos(math.radians(angle1[i])) - e * math.sin(math.radians(angle1[i])))

# 实际轮廓曲线计算
xa = []
ya = []
dx_dph = []
dy_dph = []
for i in range(len(angle1)):  # 求导数
    angle_1 = angle1[i]
    if angle_1 >= 0 and angle_1 < 45:
        ds_dph = 0
        dx_dph.append(y0[i] + ds_dph * math.sin(math.radians(angle_1)))
        dy_dph.append(-x0[i] + ds_dph * math.cos(math.radians(angle_1)))
    elif angle_1 >= 45 and angle_1 < 210:
        ds_dph = h / (2 * ph_g) * math.sin(math.pi / ph_g * math.radians(angle_1 - 45))
        dx_dph.append(y0[i] + ds_dph * math.sin(math.radians(angle_1)))
        dy_dph.append(-x0[i] + ds_dph * math.cos(math.radians(angle_1)))
    elif angle_1 >= 210 and angle_1 < 260:
        ds_dph = 0
        dx_dph.append(y0[i] + ds_dph * math.sin(math.radians(angle_1)))
        dy_dph.append(-x0[i] + ds_dph * math.cos(math.radians(angle_1)))
    else:
        ds_dph = -h / ph_b + h / ph_b * math.cos(2 * math.pi / ph_b * math.radians(angle_1 - 260))
        dx_dph.append(y0[i] + ds_dph * math.sin(math.radians(angle_1)))
        dy_dph.append(-x0[i] + ds_dph * math.cos(math.radians(angle_1)))

for i in range(len(angle1)):
    cos0 = -dy_dph[i] / math.sqrt(dx_dph[i] ** 2 + dy_dph[i] ** 2)
    xa.append(x0[i] - rr * cos0)
    sin0 = dx_dph[i] / math.sqrt(dx_dph[i] ** 2 + dy_dph[i] ** 2)
    ya.append(y0[i] - rr * sin0)

t.hideturtle()
t.speed("fastest")
# 直角坐标系
t.color('red')
t.penup()
t.goto(-500, 0)
t.pendown()
t.goto(500, 0)
t.penup()
t.goto(0, -500)
t.pendown()
t.goto(0, 500)
# 基圆
t.color('black')
t.penup()
t.goto(0, -r0 * 5)
t.pendown()
t.circle(r0 * 5)
# 理论轮廓曲线
t.penup()
t.color('blue')
t.goto(5 * x0[0], 5 * y0[0])
t.pendown()
for i in range(len(angle1)):
    t.goto(5 * x0[i], 5 * y0[i])
t.goto(5 * x0[0], 5 * y0[0])
# 实际轮廓曲线
t.width(2)
t.penup()
t.goto(5 * xa[0], 5 * ya[0])
t.pendown()
t.color('black')
for i in range(len(angle1)):
    t.goto(5 * xa[i], 5 * ya[i])
t.goto(5 * xa[0], 5 * ya[0])
# 关闭
t.done()

希望这能帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-13 12:22:31 | 显示全部楼层    本楼为最佳答案   
你好,看起来你的代码存在一些问题。首先,在提交按钮的回调函数中,你没有在函数内部对全局变量进行操作,而是创建了同名的局部变量来保存读取到的值。所以在函数外部打印输出的时候,仍然会打印出空值。你可以在函数内部使用`global`关键字来声明这些变量是全局变量,这样就可以在函数内部对它们进行赋值了。

其次,在计算理论轮廓曲线和实际轮廓曲线的部分,你使用了列表作为迭代对象,但在循环内部对列表元素进行操作的时候,并没有使用索引来指定具体的元素。也就是说,你的代码中的`angle1`、`x0`、`y0`、`dx_dph`、`dy_dph`等都应该写成`angle1[i]`、`x0[i]`、`y0[i]`、`dx_dph[i]`、`dy_dph[i]`等。

另外,你在计算理论轮廓曲线时,使用了未定义的变量`s_law`,你可以在函数内部定义一个空列表`s_law`,然后在`if-elif-else`语句块中添加元素。

最后,在绘制轮廓曲线的代码中,你需要使用循环来依次绘制每个点,而不是直接使用列表。你可以改成使用`range`函数生成索引来遍历`angle1`、`xa`和`ya`列表,然后在循环中使用索引来获取每个点的坐标。

根据上述修改,你可以改进你的代码如下:
import tkinter as tk
import math
import turtle as t

# 创建提交按钮的回调函数
def on_submit_button_click():
    global h, a1, a2, a3, a4, e, r0, rr  # 声明变量是全局变量

    # 读取Entry控件的值
    h_value = h_entry.get()
    a1_value = a1_entry.get()
    a2_value = a2_entry.get()
    a3_value = a3_entry.get()
    a4_value = a4_entry.get()
    e_value = e_entry.get()
    r0_value = r0_entry.get()
    rr_value = rr_entry.get()

    # 将读取的值转换为适当的类型(如果需要的话)
    # 例如,如果变量应该是整数或浮点数
    try:
        h = int(h_value) if h_value.isdigit() else float(h_value)
        a1 = int(a1_value) if a1_value.isdigit() else float(a1_value)
        a2 = int(a2_value) if a2_value.isdigit() else float(a2_value)
        a3 = int(a3_value) if a3_value.isdigit() else float(a3_value)
        a4 = int(a4_value) if a4_value.isdigit() else float(a4_value)
        e = int(e_value) if e_value.isdigit() else float(e_value)
        r0 = int(r0_value) if r0_value.isdigit() else float(r0_value)
        rr = int(rr_value) if rr_value.isdigit() else float(rr_value)
    except ValueError:
        print("输入值必须为数字!")
        return

    # 在这里可以使用这些变量进行进一步的处理
    # ...

# 创建主窗口
root = tk.Tk()
root.title("变量赋值界面")

# 创建Entry控件和标签
labels = ['h', 'a1', 'a2', 'a3', 'a4', 'e', 'r0', 'rr']
entries = []
for label in labels:
    tk.Label(root, text=label + ":").pack()
    entry = tk.Entry(root)
    entry.pack()
    entries.append(entry)

# 将Entry控件的引用存储到全局变量中以便在回调函数中访问
h_entry, a1_entry, a2_entry, a3_entry, a4_entry, e_entry, r0_entry, rr_entry = entries

# 创建一个提交按钮
submit_button = tk.Button(root, text="提交", command=on_submit_button_click)
submit_button.pack()

# 开始Tkinter事件循环
root.mainloop()
print(h, a1, a2, a3, a4, e, r0, rr)

ph_g = math.radians(a2 - a1)
ph_b = math.radians(a4 - a3)
angle1 = []
for i in range(240):  # 每1.5度求解
    angle1.append(i * 1.5)

s_law = []
for i in range(len(angle1)):
    angle_1 = angle1[i]
    if angle_1 >= 0 and angle_1 < 45:
        s_law.append(0)
    elif angle_1 >= 45 and angle_1 < 210:
        s = h / 2 * (1 - math.cos(math.pi / ph_g * math.radians(angle_1 - 45)))
        s_law.append(s)
    elif angle_1 >= 210 and angle_1 < 260:
        s_law.append(30)
    else:
        s = h - h / ph_b * math.radians(angle_1 - 260) + h / (2 * math.pi) * math.sin(
            2 * math.pi / ph_b * math.radians(angle_1 - 260))
        s_law.append(s)

x0 = []
y0 = []
s0 = math.sqrt(r0 ** 2 - e ** 2)
for i in range(len(angle1)):
    x0.append((s0 + s_law[i]) * math.sin(math.radians(angle1[i])) + e * math.cos(math.radians(angle1[i])))
    y0.append((s0 + s_law[i]) * math.cos(math.radians(angle1[i])) - e * math.sin(math.radians(angle1[i])))

# 实际轮廓曲线计算
xa = []
ya = []
dx_dph = []
dy_dph = []
for i in range(len(angle1)):  # 求导数
    angle_1 = angle1[i]
    if angle_1 >= 0 and angle_1 < 45:
        ds_dph = 0
        dx_dph.append(y0[i] + ds_dph * math.sin(math.radians(angle_1)))
        dy_dph.append(-x0[i] + ds_dph * math.cos(math.radians(angle_1)))
    elif angle_1 >= 45 and angle_1 < 210:
        ds_dph = h / (2 * ph_g) * math.sin(math.pi / ph_g * math.radians(angle_1 - 45))
        dx_dph.append(y0[i] + ds_dph * math.sin(math.radians(angle_1)))
        dy_dph.append(-x0[i] + ds_dph * math.cos(math.radians(angle_1)))
    elif angle_1 >= 210 and angle_1 < 260:
        ds_dph = 0
        dx_dph.append(y0[i] + ds_dph * math.sin(math.radians(angle_1)))
        dy_dph.append(-x0[i] + ds_dph * math.cos(math.radians(angle_1)))
    else:
        ds_dph = -h / ph_b + h / ph_b * math.cos(2 * math.pi / ph_b * math.radians(angle_1 - 260))
        dx_dph.append(y0[i] + ds_dph * math.sin(math.radians(angle_1)))
        dy_dph.append(-x0[i] + ds_dph * math.cos(math.radians(angle_1)))

for i in range(len(angle1)):
    cos0 = -dy_dph[i] / math.sqrt(dx_dph[i] ** 2 + dy_dph[i] ** 2)
    xa.append(x0[i] - rr * cos0)
    sin0 = dx_dph[i] / math.sqrt(dx_dph[i] ** 2 + dy_dph[i] ** 2)
    ya.append(y0[i] - rr * sin0)

t.hideturtle()
t.speed("fastest")
# 直角坐标系
t.color('red')
t.penup()
t.goto(-500, 0)
t.pendown()
t.goto(500, 0)
t.penup()
t.goto(0, -500)
t.pendown()
t.goto(0, 500)
# 基圆
t.color('black')
t.penup()
t.goto(0, -r0 * 5)
t.pendown()
t.circle(r0 * 5)
# 理论轮廓曲线
t.penup()
t.color('blue')
t.goto(5 * x0[0], 5 * y0[0])
t.pendown()
for i in range(len(angle1)):
    t.goto(5 * x0[i], 5 * y0[i])
t.goto(5 * x0[0], 5 * y0[0])
# 实际轮廓曲线
t.width(2)
t.penup()
t.goto(5 * xa[0], 5 * ya[0])
t.pendown()
t.color('black')
for i in range(len(angle1)):
    t.goto(5 * xa[i], 5 * ya[i])
t.goto(5 * xa[0], 5 * ya[0])
# 关闭
t.done()

希望这能帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 16:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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