tkinter 界面中防止用户重复输入相同的值

66 阅读2分钟

在编写一个计算器程序时,需要实现一个功能:防止用户重复输入相同的值。例如,防止用户在输入框中输入“5**2”或“2//2”之类的算式。已经实现了输入验证代码,该代码可以确保输入框中只接受 valid_input 列表中的值。但是,还需要防止用户输入两个相同的运算符,特别是除法和乘法运算符。

  1. 解决方案: 可以通过修改验证代码或 test_input 函数来实现这一功能。需要将代码修改为,当用户输入两个相同的运算符时,阻止用户继续输入。具体修改如下:
def test_input(value, action):
    # 检查是否为插入操作
    if action == "1":
        # 分割输入值,检查是否有重复的运算符
        if value in ["+", "-", "*", "/"]:
            # 如果输入的是运算符,检查前面一个字符是否也是运算符
            if display.get()[-1] in ["+", "-", "*", "/"]:
                # 如果是,则阻止输入
                return False
    # 如果不是插入操作,则允许输入
    return True

这样修改后,当用户在输入框中输入两个相同的运算符时,代码将阻止用户继续输入。

以下是一个代码示例,展示了如何使用修改后的 test_input 函数来防止用户重复输入相同的值:

from tkinter import *
from tkinter import messagebox

def replace_text(text):
    display.delete(0, END)
    display.insert(0, text)

#Calculates the input in the display        
def calculate(event = None):
    equation = display.get()
    try:
        result = eval(equation)
        replace_text(result)
        print(result) #Just for reference 
        return True 
    except: 
        messagebox.showerror("Error", "Math Error", parent = root)

#This function dosen't allow the user to input invalid values    
def test_input(value, action):
    # 检查是否为插入操作
    if action == "1":
        # 分割输入值,检查是否有重复的运算符
        if value in ["+", "-", "*", "/"]:
            # 如果输入的是运算符,检查前面一个字符是否也是运算符
            if display.get()[-1] in ["+", "-", "*", "/"]:
                # 如果是,则阻止输入
                return False
    # 如果不是插入操作,则允许输入
    return True

root = Tk() 
root.title("Calculator testing")

display = Entry(root, font=("Helvetica", 16), justify = "right", validate = "key")
display.configure(validatecommand = (display.register(test_input), "%S", "%d"))
display.insert(0, "")
display.grid(column = 0, row = 0, columnspan = 4, sticky = "NSWE", padx = 10, pady = 10)
display.bind("=", calculate)

#Equals button
button_equal = Button(root, font = ("Helvetica", 14), text = "=", command = 
calculate, bg = "#c0ded9")
button_equal.grid(column = 2, row = 1, columnspan = 2, sticky = "WE")

#All clear button 
button_clear = Button(root, font = ("Helvetica", 14), text = "AC", command = 
lambda: replace_text(""), bg = "#c0ded9")
button_clear.grid(column = 0, row = 1, columnspan = 2, sticky = "WE")

#Main Program       
root.mainloop()

使用修改后的代码,就可以防止用户在输入框中重复输入相同的值了。