【发布时间】: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() 显示labeltext7 的int(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