Как назначить переменную в поле ввода tkinter с помощью функции

1

Вот пример кода, прежде чем я объясню свою проблему.

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. Как я могу это сделать?

Теги:
tkinter

1 ответ

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()
  • 1
    В качестве альтернативы я использовал StringVar, чтобы установить пустое поле ввода на 0 после нажатия кнопки отправки. pastebin.com/J57wMsLU Хотя мне лично больше нравится ваш метод, и я буду использовать некоторые его функции в некоторых моих будущих проектах. Спасибо за идеи и предложения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню