Вот пример кода, прежде чем я объясню свою проблему.
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 и перейти к добавлению значений только в том случае, если они соответствуют, в противном случае - вызвать исключение, которое вызывает всплывающее окно Error.
что-то вроде этого, может быть?
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()
Возможно, вы могли бы class Add
свой class Add
tk.Frame
из tk.Frame
(be 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()