RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1219655
Accepted
Анатолий Михеенко
Анатолий Михеенко
Asked:2021-12-16 21:11:42 +0000 UTC2021-12-16 21:11:42 +0000 UTC 2021-12-16 21:11:42 +0000 UTC

是什么导致 _tkinter.TclError: bad entry index 错误?

  • 772

一切正常,当我按下键时,输入行的最后一个字符entry被删除←,在不知道发生了什么并且出现这样的错误之后,如何修复它,它甚至意味着什么?неверный индекс записи "end-2c,在此之前为什么它是真的?是什么改变让他不忠?也许有人会看到,我显然错过了一些东西 在此处输入图像描述

程序代码:

from tkinter import *
import tkinter as tk

# Создания кона приложения
root = Tk()
# Название окна
root.title('Python')
# Размеры окна
root.geometry('205x298')
# Запрет пользователя на изменение рамеров окна
root.resizable(width = False, height = False)




def Calculator():
    while True:
        term = Expression.get("1.0", END)
        term = term[0:-1]
        long_term = len(term)
                
        # Все индексы символов введеных пользователем
        index = []
            
        # Проводим проверку ввода пользователя
        if long_term > 0:
            # Получаем индекс каждого введеного пользователем символа
            while long_term > 0:
                long_term = long_term - 1
                index.insert(0,long_term)
        elif long_term == 0: 
            break
            
        # Все элементы строки введеной пользователем
        term_list = [term[i] for i in index]
        
        # Выход из функции если в поле ввода нет арифметических знаков 
        if set(["+" ,"-" ,"*" ,"/"]).isdisjoint(term_list) == True:
            print('Не найденно арифметическое действие!')
            Expression.delete("1.0", END)
            break
                    
        return term_list
        break


def Arithmetic_action_Plus():
    term = Decision.get()
    Expression.insert(END, term)
    Expression.insert(END, ' ' + '+' + ' ')
    Decision.delete(0, END)

def Plus_Act():
    Arithmetic_action_Plus()
    Calculator()

    
def Arithmetic_action_Minus():
    term = Decision.get()
    Expression.insert(END, term)
    Expression.insert(END, ' ' + '-' + ' ')
    Decision.delete(0, END)
def Minus_Act():
    Arithmetic_action_Minus()
    Calculator()


def Arithmetic_action_Mult():
    term = Decision.get()
    Expression.insert(END, term)
    Expression.insert(END, ' ' + '*' + ' ')
    Decision.delete(0, END)
def Mult_Act():
    Arithmetic_action_Mult()
    Calculator()
        

def Clear_fields_Act():
    Expression.delete("1.0", END)
    Decision.delete(0, END)


def Arithmetic_action_Division():
    term = Decision.get()
    Expression.insert(END, term)
    Expression.insert(END, ' ' + '/' + ' ')
    Decision.delete(0, END)
def Division_Act():
    Arithmetic_action_Division()
    Calculator()
            

def Equally_Act():
    while True:
        term = Decision.get()
        Expression.insert(END, term)
        term_list = Calculator()
        
        # Выход из функции если поле ввода пусто
        if term_list == None:
            break
            
        # Список значений ариф.знаков
        variable_arithmetic = []
        # Список чисел и ариф.знаков строки ввода
        Input_line_numbers = []
        # Список индексов списка чисел и ариф.знаков
        index_arithmetic = []
        
        # Создание списка с конкатенированными числами и ариф.знаками
        for n in term_list.copy():
            if n in ("+", "-", "*", "/"):
                #Узнаем индекс ариф.знака
                index = term_list.index(n)
                #Делаем вырезку в отдельный список от первого знака и до знака ариф.
                Input_line_numbers.append(''.join(term_list[0:index]))
                #Удоляем часть списка от первого знака и до знака арифметики
                del term_list[0:index]
                #Вырезаем в отдельный список сам знак арифметики
                Input_line_numbers.append(''.join(term_list[0]))--
                #Удоляем знак арифметики
                del term_list[0]
        
        
        #Вызераем в отдельный список последнее число
        Input_line_numbers.append(''.join(term_list[0:]))   
        #Удоляем последнее число из списка
        del term_list[0:]       
            
        for symbol in Input_line_numbers.copy():
            if symbol in ("+"):
                num1 = ''.join(Input_line_numbers[0:1])
                num2 = ''.join(Input_line_numbers[2:3])
                if not set(".").isdisjoint(num1) == True or\
                   not set(".").isdisjoint(num2) == True:
                    result = float(num1) + float(num2)
                    result = round(result, 1)
                    result = str(result)
                else:
                    try:
                        result = int(num1) + int(num2)
                    except ValueError:
                        print('\n\n   Нет числа после ариф.действия!')
                        return 'break'
                    
                    result = round(result)
                    result = str(result)
                
                del Input_line_numbers[0:3]
                Input_line_numbers.insert(0,result)
            
            if symbol in ("-"):
                num1 = ''.join(Input_line_numbers[0:1])
                num2 = ''.join(Input_line_numbers[2:3])
                if not set(".").isdisjoint(num1) == True or\
                   not set(".").isdisjoint(num2) == True:
                    result = float(num1) - float(num2)
                    result = round(result, 1)
                    result = str(result)
                else:
                    try:
                        result = int(num1) - int(num2)
                    except ValueError:
                        print('\n\n   Нет числа после ариф.действия!')
                        return 'break'
                    result = round(result)
                    result = str(result)
                
                del Input_line_numbers[0:3]
                Input_line_numbers.insert(0,result)
            
            if symbol in ("*"):
                num1 = ''.join(Input_line_numbers[0:1])
                num2 = ''.join(Input_line_numbers[2:3])
                if not set(".").isdisjoint(num1) == True or\
                   not set(".").isdisjoint(num2) == True:
                    result = float(num1) * float(num2)
                    result = round(result, 2)
                    result = str(result)
                else:
                    try:
                        result = int(num1) * int(num2)
                    except ValueError:
                        print('\n\n   Нет числа после ариф.действия!')
                        return 'break'
                    
                    result = round(result)
                    result = str(result)
                del Input_line_numbers[0:3]
                Input_line_numbers.insert(0,result)
                
            if symbol in ("/"):
                num1 = ''.join(Input_line_numbers[0:1])
                num2 = ''.join(Input_line_numbers[2:3])
                if not set(".").isdisjoint(num1) == True or\
                   not set(".").isdisjoint(num2) == True:
                    result = float(num1) / float(num2)
                    result = str(result)
                else:
                    try:
                        result = int(num1) // int(num2)
                    except ValueError:
                        print('\n\n   Нет числа после ариф.действия!')
                        return 'break'
                    result = round(result)
                    result = str(result)
                
                del Input_line_numbers[0:3]
                Input_line_numbers.insert(0,result)
        
        Decision.delete(0, END)
        Decision.insert(END, result)
        Expression.delete("1.0", END)
        break





#-------------------------------------------------------------------------------
# Создаем фреймы
Expression_line = Frame(root, background='olivedrab',  # Выражение 
                        width = 205, height = 44)     
Decision_line = Frame(root, background='olivedrab',    # Решение
                      width = 205, height = 33)      
First_line = Frame(root, background='olivedrab',       # 7 8 9 +    
                   width = 205, height = 44)         
Second_line = Frame(root, background='olivedrab',      # 4 5 6 -
                    width = 205, height = 44)         
Third_line = Frame(root, background='olivedrab',       # 1 2 3 *
                   width = 205, height = 44)          
Fourth_line = Frame(root, background='olivedrab',      # ← 0 c /
                    width = 205, height = 44)         
Fifth_line = Frame(root, background='olivedrab',       #   =   ,
                   width = 205, height = 44)          
#-------------------------------------------------------------------------------




#_Выражение_____________________________________________________________________
Expression = Text(Expression_line, background = "gainsboro", font = "Arial 9",
                  foreground = "black", width = 25)
def check_keys(event):
    if event.char.isalpha() or (event.state & 4 and event.keysym == "v"):
        return "break"

Expression.bind("<Key>", check_keys)
#-------------------------------------------------------------------------------
#_Решение_______________________________________________________________________
Decision = Entry(Decision_line, background = "gainsboro", 
                 foreground = "black", font = "Arial 13", width = 17)
Decision.bind("<Key>", check_keys)
#-------------------------------------------------------------------------------



#_7_____________________________________________________________________________
Seven = Button(First_line, text = "7", background = "#444", 
               foreground = "white", font = "Arial 14", width = 3,
               command = lambda: Decision.insert(END, "7"))
#_8_____________________________________________________________________________
Eight = Button(First_line, text = "8", background = "#444", 
               foreground = "white", font = "Arial 14", width = 3,
               command = lambda: Decision.insert(END, "8"))
#_9_____________________________________________________________________________
Nine = Button(First_line, text = "9", background = "#444", 
               foreground = "white", font = "Arial 14", width = 3,
               command = lambda: Decision.insert(END, "9"))
#_+_____________________________________________________________________________
# Создание кнопки +
Plus = Button(First_line,                  # Нахождение во фрейме
              text = "+",                  # Текст кнопки 
              background = "#555",         # Фоновый цвет кнопки
              foreground = "white",        # Цвет текста
              font = "Arial 12",           # Высота шрифта
              width = 3,                   # Высота кнопки
              height = 1,                  # Ширина кнопки
              command = Plus_Act           # Функция кнопки
              )
#-------------------------------------------------------------------------------



#_4_____________________________________________________________________________
Four = Button(Second_line, text = "4", background = "#444", 
              foreground = "white", font = "Arial 14", width = 3,
              command = lambda: Decision.insert(END, "4"))
#_5_____________________________________________________________________________
Five = Button(Second_line, text = "5", background = "#444", 
              foreground = "white", font = "Arial 14", width = 3,
              command = lambda: Decision.insert(END, "5"))
#_6_____________________________________________________________________________
Six = Button(Second_line, text = "6", background = "#444", 
              foreground = "white", font = "Arial 14", width = 3,
              command = lambda: Decision.insert(END, "6"))
#_-_____________________________________________________________________________
Minus = Button(Second_line, text = " - ", background = "#555", 
               foreground = "white", font = "Arial 12", width = 3, 
               height = 1, command = Minus_Act) 
#-------------------------------------------------------------------------------



#_1______________________________________________________________________________
One = Button(Third_line, text = "1", background = "#444", 
             foreground = "white", font = "Arial 14", width = 3,
             command = lambda: Decision.insert(END, "1"))
#_2______________________________________________________________________________
Two = Button(Third_line, text = "2", background = "#444", 
             foreground = "white", font = "Arial 14", width = 3,
             command = lambda: Decision.insert(END, "2"))
#_3______________________________________________________________________________
Three = Button(Third_line, text = "3", background = "#444", 
               foreground = "white", font = "Arial 14", width = 3,
               command = lambda: Decision.insert(END, "3"))
#_*______________________________________________________________________________
Mult = Button(Third_line, text = " * ", background = "#555", 
              foreground = "white", font = "Arial 12", width = 3, 
              command = Mult_Act) 
#--------------------------------------------------------------------------------



#_←_____________________________________________________________________________
Clear_symbol = Button(Fourth_line, text = "←", background = "#555", 
                      foreground = "white",font = "Arial 14", width = 3,    
                      command = lambda: Decision.delete("end-3c"))
#_0_____________________________________________________________________________
Zero = Button(Fourth_line, text = "0", background = "#444", 
              foreground = "white",font = "Arial 14", width = 3, 
              command = lambda: Decision.insert(END, "0"))
#_с_____________________________________________________________________________
Clear_fields = Button(Fourth_line, text = "с", background = "#555", 
                      foreground = "white", font = "Arial 14", width = 3,  
                      command = Clear_fields_Act)
#_/_____________________________________________________________________________ 
Division = Button(Fourth_line, text = " / ", background = "#555", 
                  foreground = "white", font = "Arial 12", width = 3, 
                  command = Division_Act)
#-------------------------------------------------------------------------------



#_=_____________________________________________________________________________
Pixel_Virtual = tk.PhotoImage(width = 1)
Equally = Button(Fifth_line, text = "=", background = "#555", 
                 command = Equally_Act, image = Pixel_Virtual, compound = 'c',
                 foreground = "white", font = "Arial 12", width = 147,)
#_,_____________________________________________________________________________
Comma = Button(Fifth_line, text = ".", background = "#555", 
               foreground = "white", font = "Arial 12", width = 3,
               command = lambda: Decision.insert(END, "."))
#-------------------------------------------------------------------------------




#-------------------------------------------------------------------------------
# Указываем выравнивание обьекта во фрейме и его отображение в окне
Expression.pack(side = LEFT, padx = 2, pady = 2)       # Выражение
Decision.pack(side = LEFT, padx = 2, pady = 2)         # Решение  

Seven.pack(side = LEFT, padx = 2, pady = 2)            # 7
Eight.pack(side = LEFT, padx = 2, pady = 2)            # 8
Nine.pack(side = LEFT, padx = 2, pady = 2)             # 9
Plus.pack(side = LEFT, padx = 2, pady = 2)             # +

Four.pack(side = LEFT, padx = 2, pady = 2)             # 4
Five.pack(side = LEFT, padx = 2, pady = 2)             # 5
Six.pack(side = LEFT, padx = 2, pady = 2)              # 6
Minus.pack(side = LEFT, padx = 2, pady = 2)            # -

One.pack(side = LEFT, padx = 2, pady = 2)              # 1
Two.pack(side = LEFT, padx = 2, pady = 2)              # 2
Three.pack(side = LEFT, padx = 2, pady = 2)            # 3
Mult.pack(side = LEFT, padx = 2, pady = 2)             # *

Clear_symbol.pack(side = LEFT, padx = 2, pady = 2)     # ←
Zero.pack(side = LEFT, padx = 2, pady = 2)             # 0
Clear_fields.pack(side = LEFT, padx = 2, pady = 2)     # c
Division.pack(side = LEFT, padx = 2, pady = 2)         # /

Equally.pack(side = LEFT, padx = 2, pady = 2,
             expand = 1, fill = Y)                     # =
Comma.pack(side = BOTTOM, padx = 2, pady = 2)          # ,
#-------------------------------------------------------------------------------


# Включаем отображение фрейма в окне
Expression_line.pack(anchor = W)                  # N - Север   ↑
Expression_line.pack_propagate(False)             # S - Юг      ↓

Decision_line.pack(anchor = W)                    # W - Запад   ←
Decision_line.pack_propagate(False)               # E - Восток  →

First_line.pack(anchor = W)         
First_line.pack_propagate(False)

Second_line.pack(anchor = W)        
Second_line.pack_propagate(False)

Third_line.pack(anchor = W)         
Third_line.pack_propagate(False)

Fourth_line.pack(anchor = W)        
Fourth_line.pack_propagate(False)

Fifth_line.pack(anchor = W)   
Fifth_line.pack_propagate(False)   
  



# Реализация бесконечного цикла окна (работа окна)
root.mainloop()
python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    insolor
    2021-12-16T21:34:54Z2021-12-16T21:34:54Z

    根据经验确定删除后的最后一个字符.delete("end-2c")(如本答案中的示例)适用于类对象Text(多行文本字段),但不适用于对象Entry(单行文本字段) - 这正是您的案子:

    Decision = Entry(Decision_line, background = "gainsboro", 
                     foreground = "black", font = "Arial 13", width = 17)
    

    要从 中删除最后一个字符Entry,您需要将要删除的字符的索引指定为数字。为此,需要从字段中获取文本,获取其长度,减1(最后一个字符的索引不小于长度1),例如:

    def delete_last():
        Decision.delete(len(Decision.get())-1)
    
    
    Button(text="Del", command=delete_last).pack()
    

    删除最后一个字符的另一个选项(取自此处):

    def delete_last():
        Decision.delete(Decision.index("end") - 1)
    
    
    Button(text="Del", command=delete_last).pack()
    
    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5