【问题标题】:Can not convert Tkinter entry box string values to integer values无法将 Tkinter 输入框字符串值转换为整数值
【发布时间】:2015-10-22 11:14:04
【问题描述】:

简介:

大家好,我的编程经验为零,毫无疑问,我的第一个程序遇到了一些困难......如果有人能帮助我克服这个困难,我将不胜感激。

我的问题的背景:

我在从 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(myframe2, text="Click for Modulus" 调用Selection7() 时,我没有将计算值输出到labeltext7。脚本现在执行良好,没有错误,这是我的问题,我无法计算输出函数...欢迎任何 cmets、建议或建议!

我已阅读但无法在以下位置找到答案的网站建议的许多帖子中的一些:

How to get values from entry box with tkinter

tkinter set values in entry box

https://stackoverflow.com/questions/26935846/tkinter-entry-box-issues

Python posting answer from function to entry box in GUI

http://effbot.org/tkinterbook/entry.htm

更新1:

再次您好,感谢您抽出宝贵时间发表评论和回答。我包含了一个文档字符串来解释我希望通过我的函数实现什么,希望这可以使请求更加清晰。

我将我的紧凑代码分解成更小的部分,并按照建议去掉了逗号。

这是代码的修改部分,我仍然无法输出所需的功能,感谢任何帮助。

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()  

UPDATE1.1:

大家好,在更新 1 中,我应该详细说明我的问题所在。问题是defSelection7() 中的计算没有像希望的那样显示在labeltext7 的GUI 上...当Selection7 被激活时,文本Modulus (mm cubed) = 显示在GUI 上,但是计算int(mod)不是。

更新2:

令人高兴的是,我的问题已解决,我设法让defSelection7() 显示labeltext7int(mod) 部分,方法是将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 = "Modulus (mm cubed) = " + int(mod) 从 UPDATE1 到此 UPDATE2 修订版labeltext7 = "Modulus (mm cubed) = ", mod,然后我的 GUI 按预期更新,将计算 int(mod) 正确拉出并显示为“labeltext7”。

【问题讨论】:

  • 如果你不尝试在一行代码中做这么多,这样的问题更容易调试。在一个语句中获取第一个变量,在下一个语句中对其进行转换,在另一个语句中使用它,然后将其添加到另一个语句中的标签中。这允许您检查每个中间值。将所有内容压缩成一行没有任何奖励积分。
  • 嗨 Bryan,感谢您的快速回复和推荐,公平点,我已经扩展了我正在努力解决的代码部分,并添加了一个文档字符串以增加一些清晰度并使其更容易让我得到我需要的帮助。
  • 那么,它现在在做什么呢?显示错误的值?崩溃?抛出错误?
  • 嗨,布莱恩,代码没有像我希望的那样更新我的label7。我曾希望使用从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),来显示上面的计算结果。我遇到的问题是labeltext7 = "Modulus (mm cubed) = " 中的文本按计划显示,但是labeltext7+ int(mod) 部分没有向GUI 输出值。

标签: user-interface python-3.x tkinter


【解决方案1】:

删除逗号应该可以:

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)

【讨论】:

  • 您好 Eric,感谢您查看我的帮助请求。我已经更新了我的代码以反映所提出的建议,但仍然无法生成所需的输出。我还包含了一个文档字符串,以使我尝试做的事情更加清晰。如果您能在有机会的时候复习一下并提出我可能出错的地方,那将不胜感激。
  • @Eoin:对不起,我在度假。您是否设法解决了您的问题?如果没有,您能否在问题底部发布您当前的完整代码?
  • @Eoin:如果我可以添加一些一般性建议:不要使用 StringVar、IntVar... 除非您有充分的理由这样做(通常是在多个地方使用的值)并且给你的变量和函数起有意义的名字:例如 Selection7 应该被称为 computeModulus。
  • 您好,Eric,没问题,非常感谢您提供的帮助。你会很高兴听到我解决了我最初的问题。我将采纳您的建议,为我的变量和函数赋予有意义的名称。关于 StringVar、IntVar 的使用,我经常不止一次调用与 Str/IntVar 关联的值并在我的小程序中重复使用,但很乐意阅读更多关于何时使用/不使用多个实例的信息Str/IntVar 类,如果你能转发给我一个页面的链接,最好有一些初学者的例子。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2018-01-23
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
相关资源
最近更新 更多