python - 如何使用函数将变量分配给 tkinter 的输入框
问题描述
在我解释我的问题之前,这是一个代码示例。
from tkinter import *
from tkinter import messagebox
class Add:
def __init__(self, master):
self.frame = Frame(master)
self.frame.grid()
self.entry_1 = Entry(self.frame)
self.entry_1.grid(row=0, column=0)
self.entry_2 = Entry(self.frame)
self.entry_2.grid(row=1, column=0)
self.button = Button(self.frame, text='Submit', command=self.submit)
self.button.grid(row=0, column=1)
def submit(self):
# Checks if both entries are digits.
if self.entry_1.get().isdigit() is False:
messagebox.showerror('Error', 'Invalid Character(s).')
elif self.entry_2.get().isdigit() is False:
messagebox.showerror('Error', 'Invalid Character(s).')
add_entry_1_and_2 = int(self.entry_1.get()) + int(self.entry_2.get())
print(add_entry_1_and_2)
root = Tk()
Add(root)
root.mainloop()
只要我为两个输入框分配了一个数字,此代码就可以很好地工作,但是如果我将其中一个框留空并按下提交按钮,则会引发此错误。
ValueError: invalid literal for int() with base 10: ''
我想要的是,如果其中一个框是空的,我想将该空框分配为 0。我怎么能做到这一点?
解决方案
您可以在每个输入字段中设置默认值零,并在提交时重置此值。
然后,您可以检查 try-except 块中条目值的有效性,并仅在它们符合时才继续添加值,否则,引发触发错误弹出窗口的异常。
像这样的东西,也许?
from tkinter import *
from tkinter import messagebox
class Add:
def __init__(self, master):
self.frame = Frame(master)
self.frame.grid()
self.default_value = '0'
self.entry_1 = Entry(self.frame)
self.entry_1.grid(row=0, column=0)
self.entry_2 = Entry(self.frame)
self.entry_2.grid(row=1, column=0)
self.button = Button(self.frame, text='Submit', command=self.submit)
self.button.grid(row=0, column=1)
self.reset_entry_defaults()
def reset_entry_defaults(self):
self.entry_1.delete(0,END)
self.entry_2.delete(0,END)
self.entry_1.insert(0, self.default_value)
self.entry_2.insert(0, self.default_value)
def submit(self):
try:
e1 = int(self.entry_1.get()) # <-- you may prefer to convert to float
e2 = int(self.entry_2.get()) # <-- you may prefer to convert to float
except ValueError:
messagebox.showerror('Error', 'Invalid Character(s).')
else:
add_entry_1_and_2 = e1 + e2
print(add_entry_1_and_2)
self.reset_entry_defaults()
root = Tk()
Add(root)
root.mainloop()
或者,您可以从(be a )class Add
继承,并执行以下操作:tk.Frame
tk.Frame
import tkinter as tk # <-- avoid star imports
from tkinter import messagebox
class Add(tk.Frame): # <-- inherit from tk.Frame
def __init__(self, master):
self.master = master
super().__init__(self.master) # <-- call the parent class
self.default_value = '0'
self.entry_1 = tk.Entry(self)
self.entry_1.grid(row=0, column=0)
self.entry_2 = tk.Entry(self)
self.entry_2.grid(row=1, column=0)
self.button = tk.Button(self, text='Submit', command=self.submit)
self.button.grid(row=0, column=1)
self.reset_entry_defaults()
def reset_entry_defaults(self):
self.entry_1.delete(0, tk.END)
self.entry_2.delete(0, tk.END)
self.entry_1.insert(0, self.default_value)
self.entry_2.insert(0, self.default_value)
def submit(self):
try:
e1 = int(self.entry_1.get())
e2 = int(self.entry_2.get())
except ValueError:
tk.messagebox.showerror('Error', 'Invalid Character(s).')
else:
add_entry_1_and_2 = e1 + e2
print(add_entry_1_and_2)
self.reset_entry_defaults()
root = tk.Tk()
Add(root).grid() # <-- call the tk geometry manager to place your frame in root
root.mainloop()
推荐阅读
- javascript - 反应本机 Firebase 身份验证搜索
- string - 如何在 tcl 中用 {} 输出一个完整的字符串
- scala - 解释递归求和法
- python - BingAds API:DownloadCampaignsByAccountIds:“无效的客户数据”
- python-3.x - 如何使用 discord.py 将服务器和用户 ID 存储在 json 文件中
- javascript - 将 URL 参数传递给框架
- javascript - 如何在 Jquery 中创建两个匹配函数
- c - 使用 SSE3 水平添加
- javascript - 如何使用javascript检测文本框中这些字符之间的字符和单词?
- javascript - 如何将网络摄像头视频发送到 rtmp