User interface 无法将Tkinter输入框字符串值转换为整数值
导言: 大家好,我在编程方面没有任何经验,我的第一个程序遇到一些困难也就不足为奇了……如果有人能帮我克服这个困难,我将不胜感激 我的问题的背景: 从Tkinter输入框调用整数时遇到问题。设置如下,我有一个带有描述符标签的框架、一个输入框、一个确认按钮和一个确认标签。我想到的设计是让用户输入一个数字,点击确认按钮,结果输入被存储,确认标签被更新。这一部分我没有任何问题,并且工作如所希望的User interface 无法将Tkinter输入框字符串值转换为整数值,user-interface,python-3.x,tkinter,User Interface,Python 3.x,Tkinter,导言: 大家好,我在编程方面没有任何经验,我的第一个程序遇到一些困难也就不足为奇了……如果有人能帮我克服这个困难,我将不胜感激 我的问题的背景: 从Tkinter输入框调用整数时遇到问题。设置如下,我有一个带有描述符标签的框架、一个输入框、一个确认按钮和一个确认标签。我想到的设计是让用户输入一个数字,点击确认按钮,结果输入被存储,确认标签被更新。这一部分我没有任何问题,并且工作如所希望的 from tkinter import * root = Tk() root.geometry('450x
from tkinter import *
root = Tk()
root.geometry('450x700+10+10')
root.title("Design Suite Version: 1.0")
#Creating a labelframe for my entry box/button and confirmation label
myframe2 = LabelFrame(root, text = '2: Limit state design selections:')
myframe2.grid(row=0, column=1, padx=5, pady=5, sticky = 'nw')
#Label identifying input I expect in my entry box...
Label(myframe2,
text="Proposed Member Depth:",
justify = LEFT).grid(row=21, column=0, padx=5, pady=5)
#Constructing the function for the self updating label
def Selection6():
#text expected in the confirmation label
labeltext6 = "Depth(mm) = " + str(var6.get())
#configuring the updating label
label6.config(text = labeltext6, fg='red', padx=5, pady=5)
#confirmation label location
label6 = Label(myframe2)
#confirmation label location
label6.grid(row=27, column=0, padx=0, pady=5)
#set what var is here
var6 = IntVar()
# initializing the choice
var6.set('0')
#this is my first entry box
entry6 = Entry(myframe2, textvariable=var6, width = 25)
entry6.grid(row=25, column=0, padx=5, pady=5)
#this is my first button, when clicked, runs Selection6
button = Button(myframe2, text="Click to Confirm",width = 20,
command = Selection6)
button.grid(row=26, column=0, padx=5, pady=0)
##########################################################################
#Creating a 2nd label for my entry box/button and confirmation label
Label(myframe2,
text="Proposed Member Width:",
justify = LEFT).grid(row=28, column=0,padx=5, pady=5)
def Selection6a():
labeltext6a = "Width(mm) = " + str(var6a.get())
label6a.config(text = labeltext6a, fg='red', padx=5, pady=5)
label6a = Label(myframe2)
label6a.grid(row=31, column=0, padx=0, pady=5)
var6a = IntVar()
var6a.set('0')
entry6a = Entry(myframe2, textvariable=var6a, width = 25)
entry6a.grid(row=29, column=0, padx=5, pady=5, sticky = 'w')
button = Button(myframe2, text="Click to Confirm",width = 20,
command = Selection6a)
button.grid(row=30, column=0, padx=5, pady=0)
mainloop()
首次发行:
我最初遇到的困难是,我试图从我的两个输入框(上面)获取变量输入,并通过添加以下代码在我的GUI程序(下面)中进一步使用它们
##########################################################################
#Creating a 3rd label for my button and confirmation label
Label(myframe2,
text="Member Modulus:",
justify = LEFT).grid(row=32, column=0,padx=5, pady=5)
def Selection7():
labeltext7 = "Modulus(mm cubed) = ",
+ (((str(var6a.get()) * (str(var6.get()))**2))/6)
label7.config(text = labeltext7, fg='red', padx=5, pady=5)
label7 = Label(myframe2)
label7.grid(row=34, column=0, padx=0, pady=5)
var7 = IntVar()
var7.set('0')
button = Button(myframe2, text="Click for Modulus",width = 20,
command = Selection7)
button.grid(row=33, column=0, padx=5, pady=0)
mainloop()
当我尝试获取两个变量var6.get()和var6a.get()以在函数中用于更新标签时,遇到如下错误:
labeltext7 = "Modulus(mm cubed) = " + (((str(var6a.get()) * (str(var6.get()))**2))/6)TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int' Exception in Tkinter callback
尝试修复:
我试图通过重写我的函数将字符串转换为整数,如下所示
def Selection7():
labeltext7 = "Modulus(mm cubed) = ",
+ (((int(var6a.get()) * (int(var6.get()))**2))/6)
label7.config(text = labeltext7, fg='red', padx=5, pady=5)
当前问题:
当我通过button=button调用Selection7()
时(myframe2,text=“单击以获取模数”
我没有将计算值输出到labeltext7
。脚本现在执行良好,没有错误,这是我的问题,我无法将计算结果输出到函数…欢迎任何评论、建议或建议
该网站建议的许多帖子中的一些,我已经阅读过,但在以下内容中找不到我的答案:
更新1:
您好,再次感谢您花时间进行评论和回答。我加入了一个docstring来解释我希望通过我的函数实现什么,希望这能进一步澄清请求
我将紧凑的代码分解成更小的部分,并根据建议去掉逗号
这里是代码的修改部分,我仍然无法输出所需的函数,任何帮助都非常感谢
Label(myframe2,
text="Member Modulus:",
justify = LEFT).grid(row=32, column=0,padx=5, pady=5)
"""
Selection 7()_Member Modulus:
Modulus for a rectangular section:
(Width of member x depth of member squared) divided by 6
width:var6a depth:var6
"""
def Selection7():
wdth = int(var6a.get())
dpth = int(var6.get())
dpthsqrd = int(dpth**2)
wdth_dpthsqrd = int((wdth * dpthsqrd))
mod = int(wdth_dpthsqrd/6)
labeltext7 = "Modulus (mm cubed) = "
+ int(mod)
label7.config(text = labeltext7, fg='red', padx=5, pady=5)
label7 = Label(myframe2)
label7.grid(row=34, column=0, padx=0, pady=5)
var7 = IntVar()
var7.set('0')
button = Button(myframe2, text="Click for Modulus",width = 20,
command = Selection7)
button.grid(row=33, column=0, padx=5, pady=0)
mainloop()
更新1.1:
大家好,在更新1中,我应该详细说明我的问题所在。问题是defSelection7()
中的计算没有按预期显示在labeltext7
的GUI上……文本模数(mm立方)=
在激活选择7
时显示到GUI,但计算int(mod)
未显示
更新2:
更令人高兴的是,我的问题已经解决了,我通过将int(mod)
向上移动一行,并包括一个,
,使defSelection7()
显示int(mod)
标签的部分
请参阅下面的修订代码
"""
Selection 7()_Member Modulus:
Modulus for a rectangular section:
(Width of member x depth of member squared) divided by 6
width:var6a depth:var6
"""
def Selection7():
wdth = int(var6a.get())
dpth = int(var6.get())
dpthsqrd = (dpth**2)
wdth_dpthsqrd = (wdth * dpthsqrd)
mod = (wdth_dpthsqrd/6)
labeltext7 = "Modulus (mm cubed) = ", mod
label7.config(text = labeltext7, fg='red', padx=5, pady=5)
label7 = Label(myframe2)
label7.grid(row=34, column=0, padx=0, pady=5)
var7 = IntVar()
var7.set('0')
button = Button(myframe2, text="Click for Modulus",width = 20,
command = Selection7)
button.grid(row=33, column=0, padx=5, pady=0)
mainloop()
我很高兴GUI能按预期运行。如果有人能发布一个链接让我阅读,这将有助于我确定修订的原因,我会更高兴,我压缩了labeltext7=“模数(mm立方)=”
+整数(mod)
从更新1
对于此更新2修订版labeltext7=“模数(mm立方)=”,mod
和我的GUI随后按预期更新,将计算值int(mod)
正确地拉到并显示为“labeltext7”。删除逗号应该可以:
def Selection7():
labeltext7 = "Modulus(mm cubed) = "
+ (((int(var6a.get()) * (int(var6.get()))**2))/6)
label7.config(text = labeltext7, fg='red', padx=5, pady=5)
更好的是:
def Selection7():
width = int(var6a.get())
labeltext7 = "Modulus(mm cubed) = " + (width**3/6)
label7.config(text = labeltext7, fg='red', padx=5, pady=5)
删除逗号应该可以:
def Selection7():
labeltext7 = "Modulus(mm cubed) = "
+ (((int(var6a.get()) * (int(var6.get()))**2))/6)
label7.config(text = labeltext7, fg='red', padx=5, pady=5)
更好的是:
def Selection7():
width = int(var6a.get())
labeltext7 = "Modulus(mm cubed) = " + (width**3/6)
label7.config(text = labeltext7, fg='red', padx=5, pady=5)
如果您不想在一行代码中完成这么多工作,那么调试此类问题会容易得多。在一条语句中获取第一个变量,在下一条语句中转换它,在另一条语句中的表达式中使用它,然后在另一条语句中将它添加到标签中。这允许您检查每个中间值。将所有这些值压缩到s中没有额外的好处单行。嗨,布莱恩,谢谢你的快速回复和推荐,公平点,我已经扩展了我正在努力解决的代码部分,并添加了一个文档字符串,以增加一些清晰度,使我更容易获得我需要的帮助。那么,它现在在做什么?显示错误的值?崩溃?抛出错误?嗨,布莱恩,公司de没有像我希望的那样更新我的label7
。我希望使用从wdth=int(var6a.get())
和dpth=int(var6.get())
收集的变量来定义dpthsqrd=int(dpth**2)
和'wdth\u dpthsqrd=int((wdth*dpthsqrd))'
。然后我希望使用labeltext7=“模数(mm立方)=”+int(mod)
,来显示上面的计算结果。我遇到的问题是labeltext7=“模数(mm立方)=”
中的文本按计划显示,但是+int(mod)labeltext7
的部分未将值输出到GUI。如果不尝试在一行代码中执行太多操作,则此类问题更容易调试。在一条语句中获取第一个变量,在下一条语句中转换,在另一条语句中的表达式中使用,然后在另一条语句中将其添加到标签中。这允许您检查每一条语句中的变量中间值。将所有内容压缩成一行没有任何额外的积分。嗨,Bryan,感谢您的快速回复和推荐,公平点,我已经扩展了我正在努力解决的代码部分,并添加了一个文档字符串以增加清晰度,使我更容易获得我需要的帮助。那么,它现在在做什么?显示错误的值?崩溃?抛出错误?嗨,布莱恩,代码没有像我希望的那样更新我的label7
。我希望使用从wdth=int(var6a.get())
和dpth=int(var6.get())
收集的变量来形成dpthsqrd=int(dpth**2)
和'wdth\u dpthsqrd=int((wdth*thdpsqrd)),来定义mod=int(wdth_dpthsqrd/6)
。然后我希望使用labeltext7=“mod