首页 > 编程问答 >Tkinter ttkbootstrap 上的属性错误

Tkinter ttkbootstrap 上的属性错误

时间:2024-07-30 16:52:02浏览次数:11  
标签:python tkinter attributeerror

所以我使用 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() 方法,因此出现错误。

以下是更详细的说明:

  1. StringVar 的初始化: 正确地将 S U V A T 初始化为 StringVar 。这些变量旨在保存与的输入字段相关联的值。

  2. UAM_Eval 中重新分配: UAM_Eval 函数中,根据某些条件用字符串重新分配了 S U V A T 。例如: python S='((float(U.get())+float(V.get()))*float(T.get()))/2' 这将 S 从一个 StringVar 变成一个表示计算的字符串。

  3. 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 和字符串之间的冲突,并提供了一种更清晰的方式来处理的计算和结果。

标签:python,tkinter,attributeerror
From: 78810666

相关文章

  • Python - Creating alternative initializers using class Methods
    Classmethodsallowustodefinealternativeinitializers(alsoknownasfactorymethods)inaclass.Thesemethodshelpuscreateinstanceobjectsfromdifferenttypesofinputdata.Letusunderstandthiswiththehelpofanexample.Again,wetakethe......
  • 如何让 Python 请求信任自签名 SSL 证书?
    importrequestsdata={'foo':'bar'}url='https://foo.com/bar'r=requests.post(url,data=data)如果URL使用自签名证书,则会失败requests.exceptions.SSLError:[Errno1]_ssl.c:507:error:14090086:SSLroutines:SSL3_GET_SERVER_CERTIF......
  • python 偏函数
    如下代码loop=tornado.ioloop.IOLoop.current()ctx=contextvars.copy_context()func_call=functools.partial(ctx.run,func,*args,**kwargs)returnawaitloop.run_in_executor(executor,func_call)偏函数一个函数作为模板,通过提供部分参数来产生一个新的函数。......
  • Chapter 18 Python异常
    欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!文章目录前言一、什么是异常二、捕获异常三、异常的传递前言在Python中,异常是一种特定的对象,能够在程序运行过程中被抛出和处理。有效地管理异常不仅可以增强程序的稳定性,还可以提高用户体验,使程......
  • Python正则表达式匹配数字的第一次重复
    示例:For0123123123,1应匹配,因为第二个1出现在任何其他数字重复之前。For01234554321,5应该匹配,因为第二个5出现在任何其他数字的重复之前。我尝试过的一些正则表达式:......
  • 当 python 极坐标中某些列条目为空时,如何分解 List[_] 列?
    给定如下所示的Polarsdf,如何在两列上调用explode(),同时将空条目扩展到正确的长度以与其行匹配?shape:(3,2)┌───────────┬─────────────────────┐│x┆y││---┆---......
  • 使用python从网站自动下载pdf时出错
    我想从一个名为epadossier.nl的网站自动批量下载pdf我用谷歌搜索了这个并找到了一段代码并修复了一个小错误。所以现在我得到了这个`importrequestsurl="https://www.epadossier.nl/adres/plaats/straat/num"response=requests.get(url)ifresponse.status_cod......
  • 避免字符串连接的嵌套循环的 Pythonic 方法
    我想找到所有5位数字的字符串,其中前三位数字在我的第一个列表中,第二个槽第四个数字在我的第二个列表中,第三到第五个数字在我的最后一个列表中:l0=["123","567","451"]l1=["234","239","881"]l2=["348","551","399"......
  • Python 环境配置(二)安装jupyter、matplotlib、numpy库
    Python环境配置(二)安装jupyter、matplotlib、numpy库一、numpypipinstallnumpy二、matplotlibpipinstallmatplotlib三、jupyter1、anaconda自带Jupyter2、pycharm插件只有Pycharm的Professional版才支持JupyterNotebook,请注意版本3、新建文件#%......
  • 如何使用 PIPE 并行运行 python 子进程?
    我正在使用inkscape将一堆SVG图像转换为PNG。单线程:importsubprocessimporttimeimportosinkscape_path=r'C:\ProgramFiles\Inkscape\bin\inkscape.com'steps=30filenames=[]processes=[]#t_start=time.process_time()t_start=time.time()f......