User interface 无法将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

导言:

大家好,我在编程方面没有任何经验,我的第一个程序遇到一些困难也就不足为奇了……如果有人能帮我克服这个困难,我将不胜感激

我的问题的背景:

从Tkinter输入框调用整数时遇到问题。设置如下,我有一个带有描述符标签的框架、一个输入框、一个确认按钮和一个确认标签。我想到的设计是让用户输入一个数字,点击确认按钮,结果输入被存储,确认标签被更新。这一部分我没有任何问题,并且工作如所希望的

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