仅当条目中包含文本时才将 Tkinter 条目值作为整数进行比较
Compare Tkinter entry values as integers only when the entry has text inside of it
我需要对条目做一些基本的条件逻辑,但我运行遇到了一个问题。
有 2 个条目,“剂量”和“周”。两者都将只输入数字(25、3 等)。我有一个“获取信息”按钮,它激活一个函数,该函数将对条目执行条件逻辑,尽管自从程序 运行s 条目内没有任何文本时,我 运行 进入一个错误。
ValueError: invalid literal for int() with base 10: ''
这是我的代码:
from tkinter import *
import tkinter.font as font
# Window setup
root = Tk()
root.title("Dosage GUI")
root.geometry("330x450")
# Entries
weekEntry = Entry(root)
dosageEntry = Entry(root)
# Labels to describe entries
weekLabel = Label(root, text="Week #")
dosageLabel = Label(root, text="Dosage in mg (enter only a number)")
# Information text
# State = disabled, but when changing text, change to normal, then back to disabled
def setInfoText(textBox, text):
textBox.config(state="normal")
textBox.insert(1.0, text)
textBox.config(state="disabled")
infoTextFont = font.Font(size=8)
infoText = Text(root, height=17, width=30, padx=10,pady=10, state="disabled", font=infoTextFont, bd=5,bg="#e8ebea")
# Get Info button
def getInfo(week, dosage):
# Check what is possible based on the dosage rules
if week > 3:
setInfoText(infoText, "PI may change dosage if needed.")
if week < 3:
setInfoText(infoText, "PI cannot change dosage until week 3.")
getInfoFont = font.Font(size=13,weight="bold")
getInfoBut = Button(root, text="Get Info", padx=20,pady=20,bd=10,bg="#7299ed",activebackground="#729ffc", fg="#40e677", command=getInfo(int(weekEntry.get()), int(dosageEntry.get())))
getInfoBut['font'] = getInfoFont
# Grid
weekEntry.grid(row=0,column=5)
dosageEntry.grid(row=0, column=10)
weekLabel.grid(row=5,column=5)
dosageLabel.grid(row=5,column=10)
getInfoBut.place(x=100,y=70)
infoText.place(x=50,y=170)
# mainloop
root.mainloop()
command
关键字参数需要一个函数作为参数。
现在您正在传递 getInfo(int(weekEntry.get()), int(dosageEntry.get()))
- 这是 getInfo 的 return 值 - 这是 None(因为该函数中没有 return 语句).
相反,您可能希望在 lambda 中传递一个语句 - 这样您就可以创建一个函数,只要按下该按钮就会调用该函数:
getInfoBut = Button(root, text="Get Info", padx=20,pady=20,bd=10,bg="#7299ed",activebackground="#729ffc", fg="#40e677", command=lambda: getInfo(int(weekEntry.get()), int(dosageEntry.get())))
发生错误的原因是因为 Python 甚至在 UI 显示之前就尝试评估对 getInfo
的调用 - 字段 weekEntry
和 dosageEntry
此时为空 - 尝试将空字符串转换为 int 会导致错误。
我需要对条目做一些基本的条件逻辑,但我运行遇到了一个问题。
有 2 个条目,“剂量”和“周”。两者都将只输入数字(25、3 等)。我有一个“获取信息”按钮,它激活一个函数,该函数将对条目执行条件逻辑,尽管自从程序 运行s 条目内没有任何文本时,我 运行 进入一个错误。
ValueError: invalid literal for int() with base 10: ''
这是我的代码:
from tkinter import *
import tkinter.font as font
# Window setup
root = Tk()
root.title("Dosage GUI")
root.geometry("330x450")
# Entries
weekEntry = Entry(root)
dosageEntry = Entry(root)
# Labels to describe entries
weekLabel = Label(root, text="Week #")
dosageLabel = Label(root, text="Dosage in mg (enter only a number)")
# Information text
# State = disabled, but when changing text, change to normal, then back to disabled
def setInfoText(textBox, text):
textBox.config(state="normal")
textBox.insert(1.0, text)
textBox.config(state="disabled")
infoTextFont = font.Font(size=8)
infoText = Text(root, height=17, width=30, padx=10,pady=10, state="disabled", font=infoTextFont, bd=5,bg="#e8ebea")
# Get Info button
def getInfo(week, dosage):
# Check what is possible based on the dosage rules
if week > 3:
setInfoText(infoText, "PI may change dosage if needed.")
if week < 3:
setInfoText(infoText, "PI cannot change dosage until week 3.")
getInfoFont = font.Font(size=13,weight="bold")
getInfoBut = Button(root, text="Get Info", padx=20,pady=20,bd=10,bg="#7299ed",activebackground="#729ffc", fg="#40e677", command=getInfo(int(weekEntry.get()), int(dosageEntry.get())))
getInfoBut['font'] = getInfoFont
# Grid
weekEntry.grid(row=0,column=5)
dosageEntry.grid(row=0, column=10)
weekLabel.grid(row=5,column=5)
dosageLabel.grid(row=5,column=10)
getInfoBut.place(x=100,y=70)
infoText.place(x=50,y=170)
# mainloop
root.mainloop()
command
关键字参数需要一个函数作为参数。
现在您正在传递 getInfo(int(weekEntry.get()), int(dosageEntry.get()))
- 这是 getInfo 的 return 值 - 这是 None(因为该函数中没有 return 语句).
相反,您可能希望在 lambda 中传递一个语句 - 这样您就可以创建一个函数,只要按下该按钮就会调用该函数:
getInfoBut = Button(root, text="Get Info", padx=20,pady=20,bd=10,bg="#7299ed",activebackground="#729ffc", fg="#40e677", command=lambda: getInfo(int(weekEntry.get()), int(dosageEntry.get())))
发生错误的原因是因为 Python 甚至在 UI 显示之前就尝试评估对 getInfo
的调用 - 字段 weekEntry
和 dosageEntry
此时为空 - 尝试将空字符串转换为 int 会导致错误。