所以我使用 tkinter ttk bootstrap 编写这个应用程序。它在主窗口上运行良好,但是当我尝试在新窗口中打印函数的结果时,它说
AttributeError: 'str' object has not attribute 'get'
我对编码完全陌生,所以我将不胜感激。
这是代码:
from tkinter import*
from ttkbootstrap.constants import*
import ttkbootstrap as tb
root=tb.Window(themename="cosmo")
root.title("UAM Simple Evaluator")
root.geometry("1000x500+180+10")
frame1=tb.Frame(root,bootstyle="light",borderwidth=0)
frame1.pack(pady=18,padx=18)
label1=tb.Label(frame1,text="Welcome to UAM Simple Evaluator!", font=("BrushScript", 24),bootstyle=("light,INVERSE"))
label1.pack(pady=10,padx=10)
paralabel2="""UAM Simple Evaluator utilizes the uniformly accelerated motion formulas
to return users with their desired physical quantities. In order to use it,
please input the numerical values of the known variables and
enter 'unknown' for the unknown variables below."""
frame2=tb.Frame(root,bootstyle="light")
frame2.pack(pady=5,padx=10)
label2=tb.Label(frame2,text=paralabel2,font= ("ComicSans",18),wraplength=900,borderwidth=0,bootstyle=('light,INVERSE'),justify='center')
label2.pack(pady=10,padx=1,fill="both")
frame3=tb.Frame(root,bootstyle='light')
frame3.pack(pady=5,padx=10)
frame3.columnconfigure(0,weight=1)
frame3.columnconfigure(1,weight=8)
frame3.columnconfigure(4,weight=1)
frame3.columnconfigure(5,weight=2)
S=tb.StringVar(frame3)
U=tb.StringVar(frame3)
V=tb.StringVar(frame3)
A=tb.StringVar(frame3)
T=tb.StringVar(frame3)
S_label=tb.Label(frame3, text="Displacement(m)", font=("Arial", 16))
S_entry=tb.Entry(frame3, font=("Arial",16),textvariable=S)
U_label=tb.Label(frame3, text="Initial Velocity(m/s)", font=("Arial", 16))
U_entry=tb.Entry(frame3, font=("Arial",16),textvariable=U)
V_label=tb.Label(frame3, text="Final Velocity(m/s)", font=("Arial", 16))
V_entry=tb.Entry(frame3, font=("Arial",16),textvariable=V)
A_label=tb.Label(frame3, text="Acceleration(m/s^2)", font=("Arial", 16))
A_entry=tb.Entry(frame3, font=("Arial",16),textvariable=A)
T_label=tb.Label(frame3, text="Time(s)", font=("Arial", 16))
T_entry=tb.Entry(frame3, font=("Arial",16),textvariable=T)
def UAM_Eval():
global S
global U
global V
global A
global T
if S.get()=='unknown' and A.get()=='unknown':
S='((float(U.get())+float(V.get()))*float(T.get()))/2'
A='(float(V.get())-float(U.get()))/float(T.get())'
S1=round(eval(S),2)
A1=round(eval(A),2)
print("The value of the distance is",(S1))
print("The value of the acceleration is",(A1))
elif S.get()=='unknown' and V.get()=='unknown':
S2='(float(U.get())*float(T.get()))+((float(A.get())*(float(T.get())**2))/2)'
V='float(U.get())+(float(A.get())*float(T.get()))'
S3=round(eval(S2),2)
V1=round(eval(V),2)
print("The value of the distance is",S3)
print("The value of the final velocity is",V1)
elif S.get()=='unknown' and U.get()=='unknown':
S4='(float(V.get())*float(T.get()))-(float(A.get())*(float(T.get())**2))/2'
U='float(V.get())-(float(A.get())*float(T.get()))'
S5=round(eval(S4),2)
U1=round(eval(U),2)
print("The value of the distance is",S5)
print("The value of the initial velocity is",U1)
elif S.get()=='unknown' and T.get()=='unknown':
S6='((float(V.get())**2)-(float(U.get())**2))/(2*float(A.get()))'
T='(float(V.get())-float(U.get()))/float(A.get())'
S7=round(eval(S6),2)
T1=round(eval(T),2)
print("The value of the distance is",S7)
print("The value of the time is",T1)
elif U.get()=='unknown' and A.get()=='unknown':
U2='((2*float(S.get()))/float(T.get()))-float(V.get())'
A2='(-2*(float(S.get())-(float(V.get())*float(T.get()))))/(float(T.get())**2)'
U3=round(eval(U2),2)
A3=round(eval(A2),2)
print("The value of the initial velocity is",(U3))
print("The value of the acceleration is",(A3))
elif U.get()=='unknown' and V.get()=='unknown':
U4='(float(S.get())-((float(A.get())*(float(T.get())**2))/2))/float(T.get())'
V2='(float(S.get())+((float(A.get())*(float(T.get())**2))/2))/float(T.get())'
U5=round(eval(U4),2)
V3=round(eval(V2),2)
print("The value of the initial velocity is",U5)
print("The value of the final velocity is",V3)
elif U.get()=='unknown' and T.get()=='unknown':
U6='((float(V.get())**2)-(2*(float(A.get())*float(S.get()))))**(1/2)'
U7=round(eval(U6),2)
T2='(float(V.get())-float(U7))/float(A.get())'
T3=round(eval(T2),2)
print("The value of the initial velocity is",U7)
print("The value of the time is",T3)
elif V.get()=='unknown' and A.get()=='unknown':
V4='((2*float(S.get()))/float(T.get()))-float(U.get())'
A4='((2*(float(S.get())-(float(U.get())*float(T.get())))))/(float(T.get())**2)'
V5=round(eval(V4))
A5=round(eval(A4))
print("The value of the final velocity is",V5)
print("The value of the acceleration is",A5)
elif V.get()=='unknown' and T.get()=='unknown':
V6='((float(U.get())**2)+(2*float(A.get())*float(S.get())))**(1/2)'
V7=round(eval(V6),2)
T4='(float(V7)-float(U.get()))/float(A.get())'
T5=round(eval(T4),2)
print("The value of the final velocity is",V7)
print("The value of the time is",T5)
elif A.get()=='unknown' and T.get()=='unknown':
A6='((float(V.get())**2)-(float(U.get())**2))/(2*float(S.get()))'
T6='(2*float(S.get()))/(float(U.get())+float(V.get()))'
A7=round(eval(A6),2)
T7=round(eval(T6),2)
print("The value of the acceleration is",A7)
print("The value of the time is",T7)
def result_printer():
result_window=tb.Toplevel(root)
result=UAM_Eval()
resultL=tb.Label(result_window,text="result")
Calc_btn=tb.Button(frame3, text="Calculate", command=UAM_Eval, width=20)
result_btn=tb.Button(frame3,text="Next Page",command=result_printer,width=20,bootstyle="info")
S_label.grid(row=0,column=0)
S_entry.grid(row=0,column=1,sticky=tb.W)
U_label.grid(row=1,column=0)
U_entry.grid(row=1,column=1,sticky=tb.W)
V_label.grid(row=2,column=0)
V_entry.grid(row=2,column=1,sticky=tb.W)
A_label.grid(row=3,column=0)
A_entry.grid(row=3,column=1,sticky=tb.W)
T_label.grid(row=4,column=0)
T_entry.grid(row=4,column=1,sticky=tb.W)
Calc_btn.grid(row=5,column=1,rowspan=2,sticky=tb.N)
result_btn.grid(row=8,column=1,)
root.mainloop()
我只想在新窗口或新页面上打印结果。我不知道为什么要这样做。
错误发生是因为混淆了变量
S
、
U
、
V
、
A
和
T
的用途。在某些地方,将它们用作字符串,在其他地方,将它们用作
tkinter
变量。这就是错误的原因。当执行类似
S.get()
的操作时,是在尝试从字符串获取值,而字符串没有
get()
方法,因此出现错误。
以下是更详细的说明:
-
StringVar
的初始化: 正确地将S
、U
、V
、A
和T
初始化为StringVar
。这些变量旨在保存与的输入字段相关联的值。 -
在
UAM_Eval
中重新分配: 在UAM_Eval
函数中,根据某些条件用字符串重新分配了S
、U
、V
、A
和T
。例如:python S='((float(U.get())+float(V.get()))*float(T.get()))/2'
这将S
从一个StringVar
变成一个表示计算的字符串。 -
StringVar
的使用冲突: 稍后,尝试使用S.get()
,但现在S
是一个字符串,而不是StringVar
,因此出现错误。
为了解决这个问题,应该在计算中使用单独的变量,并保持
StringVar
用于存储输入字段的值。以下是可以如何修改代码的方法:
from tkinter import *
from ttkbootstrap.constants import *
import ttkbootstrap as tb
# ...(其余代码与之前相同)...
def UAM_Eval():
global S
global U
global V
global A
global T
# 从输入字段获取值
s_val = S.get()
u_val = U.get()
v_val = V.get()
a_val = A.get()
t_val = T.get()
# 进行计算
if s_val == 'unknown' and a_val == 'unknown':
s_result = ((float(u_val) + float(v_val)) * float(t_val)) / 2
a_result = (float(v_val) - float(u_val)) / float(t_val)
return f"位移值为:{round(s_result, 2)}\n加速度值为:{round(a_result, 2)}"
# ...(其他条件的计算)...
def result_printer():
result_window = tb.Toplevel(root)
result_window.title("计算结果")
result = UAM_Eval()
result_label = tb.Label(result_window, text=result)
result_label.pack(pady=20, padx=20)
# ...(其余代码与之前相同)...
在这个修改后的代码中:
-
UAM_Eval
现在直接根据输入值计算结果,并返回一个格式化的字符串,其中包含结果。 -
result_printer
获取计算结果并将其显示在标签中。
这种方法避免了
StringVar
和字符串之间的冲突,并提供了一种更清晰的方式来处理的计算和结果。