写一个蒙特卡洛方法的可靠性计算软件 我设置了四个单选框radio_bt1234来让用户选择分布类型1234 然后用一个全局变量s_val把分布类型记录下来 但是不管用户点击什么最后s_val都等于0 不知道这是什么原因导致的呢
```python
import tkinter as tk
import tkinter.messagebox as messagebox
from numpy import*
#设计交互页面
#s_val强度分布种类
#r_val应力分布种类
para1_1 = 0
para1_2 = 0
para2_1 = 0
para2_2 = 0
class basedesk:
def __init__(self, master):
self.root = master
self.root.config()
self.root.title('可靠性计算')
self.root.geometry('400x300')
initface1(self.root)
class initface1:
def get_val1(self):
global s_val
s_val = self.s_value.get()
def __init__(self, master):
self.master = master
#基准界面initface1
self.initface1 = tk.Frame(self.master, )
self.initface1.pack()
reminder = tk.Label(self.initface1, text='请选择应力符合的分布', width=50, height=10)
reminder.pack()
#获取应力分布的按键设计
self.s_value = tk.IntVar()
self.radio()
tk.Button(self.initface1, text='确定', command=self.change).pack()
def radio(self):
radio_bt1=tk.Radiobutton(self.initface1, text='正态分布', variable=self.s_value, value=1,
command=self.get_val1())
radio_bt2=tk.Radiobutton(self.initface1, text='对数正态分布', variable=self.s_value, value=2,
command=self.get_val1())
radio_bt3=tk.Radiobutton(self.initface1, text='指数分布', variable=self.s_value, value=3,
command=self.get_val1())
radio_bt4=tk.Radiobutton(self.initface1, text='威布尔分布', variable=self.s_value, value=4,
command=self.get_val1())
radio_bt1.pack()
radio_bt2.pack()
radio_bt3.pack()
radio_bt4.pack()
def change(self, ):
self.initface1.destroy()
face1(self.master)
class face1:
def __init__(self, master):
self.master = master
self.face1 = tk.Frame(self.master, )
self.face1.pack()
global s_val
print(s_val)
if s_val==1|s_val==2:
tk.Label(self.face1, text='请填写该分布的两个参数', width=50, height=10).pack()
tk.Label(self.face1, text='均值').pack()
self.parameter1 = tk.Entry(self.face1, relief='groove', width=20)
self.parameter1.pack()
tk.Label(self.face1, text='标准差').pack()
self.parameter2 = tk.Entry(self.face1, relief='groove', width=20)
self.parameter2.pack()
else:
tk.Label(self.face1, text='请填写该分布的参数', width=50, height=10).pack()
self.parameter1 = tk.Entry(self.face1, relief='groove', width=20)
self.parameter1.pack()
tk.Label(self.face1, text='注意:只能输入数字').pack()
tk.Button(self.face1, text='确定', command=self.com).pack()
def com(self):
global para1_1
global para1_2
global s_val
if s_val == 1 | s_val == 2:
if self.parameter1.get().isdigit()&self.parameter2.get().isdigit():
para1_1 = float(self.parameter1.get())
para1_2 = float(self.parameter2.get())
self.change()
else:
messagebox.showwarning('警告', '请输入数字')
else:
if self.parameter1.get().isdigit():
para1_1 = self.parameter1.get()
para1_2 = 0
self.change()
else:
messagebox.showwarning('警告', '请输入数字')
def change(self,):
self.face1.destroy()
initface2(self.master)
class initface2:
def __init__(self, master):
self.master = master
#第二个确认分布界面
self.initface2 = tk.Frame(self.master, )
self.initface2.pack()
reminder = tk.Label(self.initface2, text='请选择强度符合的分布', width=50, height=10)
reminder.pack()
#获取应力分布的按键设计
self.r_value = tk.IntVar()
radio_bt1 = tk.Radiobutton(self.initface2, text='正态分布', variable=self.r_value, value=1,
command=self.get_val2())
radio_bt2 = tk.Radiobutton(self.initface2, text='对数正态分布', variable=self.r_value, value=2,
command=self.get_val2())
radio_bt3 = tk.Radiobutton(self.initface2, text='指数分布', variable=self.r_value, value=3,
command=self.get_val2())
radio_bt4 = tk.Radiobutton(self.initface2, text='威布尔分布', variable=self.r_value, value=4,
command=self.get_val2())
radio_bt1.pack()
radio_bt2.pack()
radio_bt3.pack()
radio_bt4.pack()
btn = tk.Button(self.initface2, text='确定', command=self.change)
btn.pack()
def change(self, ):
self.initface2.destroy()
face2(self.master)
def get_val2(self):
global r_val
r_val = int(self.r_value.get())
class face2:
def __init__(self, master):
self.master = master
self.face2 = tk.Frame(self.master, )
self.face2.pack()
global r_val
if r_val == 1 | r_val == 2:
tk.Label(self.face2, text='请填写该分布的两个参数', width=50, height=10).pack()
tk.Label(self.face2, text='均值').pack()
self.parameter3 = tk.Entry(self.face2, relief='groove', width=20)
self.parameter3.pack()
tk.Label(self.face2, text='标准差').pack()
self.parameter4 = tk.Entry(self.face2, relief='groove', width=20)
self.parameter4.pack()
else:
tk.Label(self.face2, text='请填写该分布的参数', width=50, height=10).pack()
self.parameter3 = tk.Entry(self.face2, relief='groove', width=20)
self.parameter3.pack()
tk.Label(self.face2, text='注意:只能输入数字').pack()
tk.Button(self.face2, text='确定', command=self.com).pack()
def com(self):
global para2_2
global para2_1
global r_val
if r_val == 1 | r_val == 2:
if self.parameter3.get().isdigit() & self.parameter4.get().isdigit():
para2_1 = float(self.parameter3.get())
para2_2 = float(self.parameter4.get())
else:
messagebox.showwarning('警告', '请输入数字')
else:
if self.parameter3.get().isdigit():
para2_1 = float(self.parameter3.get())
para2_2 = 0
else:
messagebox.showwarning('警告', '请输入数字')
self.cal_res(s_val, r_val, para1_1, para1_2, para2_1, para2_2)
def cal_res(self,type1, type2, p1, p2, p3, p4):
if type1==1:
x1 = random.normal(p1, p2, size=(1000, 1))
elif type1==2:
x1 = random.lognormal(p1, p2, size=(1000, 1)), 2
elif type1==3:
x1 = random.weibull(p1, size=(1000, 1)), 2
else:
x1 = random.exponential(float(p1), size=(1000, 1)), 2
if type2==1:
x2 = random.normal(p3, p4, size=(1000, 1)), 2
elif type1==2:
x2 = random.lognormal(p3, p4, size=(1000, 1)), 2
elif type1==3:
x2 = random.weibull(p3, size=(1000, 1)), 2
else:
x2 = random.exponential(p3, size=(1000, 1)), 2
times = 0
n1 = 0
while times<1000:
if x1[times] > x2[times]:
n1 = n1+1
times = times+1
result = n1/1000
messagebox.showinfo('结果显示', '可靠性计算结果为'+str(result))
if __name__ == '__main__':
root = tk.Tk()
basedesk(root)
root.mainloop()
```
ChatGPT回复:
在你的代码中,command=self.get_val1() 的部分调用了函数 get_val1(),它在单选框被创建时就被执行了。因此,当你启动应用程序时,get_val1() 被执行,全局变量s_val 被赋值为它的默认值0。当你单击单选按钮时,对应的值被设置为用户的选择,但这不会影响s_val的值。
你需要将 command=self.get_val1() 更改为 command=self.get_val1,这样函数不会在单选按钮被创建时立即被调用,而是在单选按钮被单击时被调用。