江一a 发表于 2024-5-13 12:21:37

求助

凸轮设计加交互界面,但是我的变量都是空值{:5_104:}


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
    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)
    elifangle_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)*math.sin(math.radians(angle1)) + e*math.cos(math.radians(angle1)))
    y0.append((s0 + s_law)*math.cos(math.radians(angle1)) - e*math.sin(math.radians(angle1)))


#实际轮廓曲线计算
xa = []
ya = []
dx_dph = []
dy_dph = []
for i in range(len(angle1)):#求导数
    angle_1 = angle1
    if angle_1 >= 0 and angle_1 < 45:
      ds_dph = 0
      dx_dph.append(y0+ds_dph*math.sin(math.radians(angle_1)))
      dy_dph.append(-x0+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+ds_dph*math.sin(math.radians(angle_1)))
      dy_dph.append(-x0+ds_dph*math.cos(math.radians(angle_1)))
    elifangle_1 >= 210 and angle_1 < 260:
      ds_dph = 0
      dx_dph.append(y0+ds_dph*math.sin(math.radians(angle_1)))
      dy_dph.append(-x0+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+ds_dph*math.sin(math.radians(angle_1)))
      dy_dph.append(-x0+ds_dph*math.cos(math.radians(angle_1)))
for i in range(len(angle1)):
    cos0 = -dy_dph/math.sqrt(dx_dph**2+dy_dph**2)
    xa.append(x0 - rr*cos0 )
    sin0 = dx_dph/math.sqrt(dx_dph**2+dy_dph**2)
    ya.append(y0 - 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,5*y0)
t.pendown()
for i in range(len(angle1)):
    t.goto(5*x0,5*y0)
t.goto(5*x0,5*y0)
#实际轮廓曲线
t.width(2)
t.penup()
t.goto(5*xa,5*ya)
t.pendown()
t.color('black')
for i in range(len(angle1)):
    t.goto(5*xa,5*ya)
t.goto(5*xa,5*ya)
#关闭
t.done()


FishC 发表于 2024-5-13 12:22:31

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

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

另外,你在计算理论轮廓曲线时,使用了未定义的变量`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
    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) * math.sin(math.radians(angle1)) + e * math.cos(math.radians(angle1)))
    y0.append((s0 + s_law) * math.cos(math.radians(angle1)) - e * math.sin(math.radians(angle1)))

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

for i in range(len(angle1)):
    cos0 = -dy_dph / math.sqrt(dx_dph ** 2 + dy_dph ** 2)
    xa.append(x0 - rr * cos0)
    sin0 = dx_dph / math.sqrt(dx_dph ** 2 + dy_dph ** 2)
    ya.append(y0 - 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, 5 * y0)
t.pendown()
for i in range(len(angle1)):
    t.goto(5 * x0, 5 * y0)
t.goto(5 * x0, 5 * y0)
# 实际轮廓曲线
t.width(2)
t.penup()
t.goto(5 * xa, 5 * ya)
t.pendown()
t.color('black')
for i in range(len(angle1)):
    t.goto(5 * xa, 5 * ya)
t.goto(5 * xa, 5 * ya)
# 关闭
t.done()

希望这能帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 求助