Как создать и/или инициализировать атрибут в Python?

При попытке создать калькулятор на Python дважды появляется ошибка о том, что у «Калькулятора» нет атрибута «ключ», а также проблема с чем-то еще. Как исправить эти ошибки?

Я попытался инициализировать атрибут как можно лучше, но произошла еще одна ошибка. Ошибки в строках 31 и 59.

Редактировать: У нас все хорошо. Если вы хотите попробовать это, репозиторий Git находится https://github.com/DerpOKat21/Random-projects

import tkinter as tk

class Calculator:
    def __init__(self, master):
        self.master = master
        master.title("Calculator")

        # Create display
        self.display = tk.Entry(master, width=35, borderwidth=5, font=('Arial', 16))
        self.display.grid(row=0, column=0, columnspan=4, padx=10, pady=10)

        # Create buttons
        button_list = [
            '7', '8', '9', '/',
            '4', '5', '6', '*',
            '1', '2', '3', '-',
            '0', '.', '=', '*'
        ]

        row = 1
        col = 0
        for button_text in button_list:
            button = tk.Button(master, text=button_text, width=5, height=2, font=('Arial', 14),
            command=lambda x=button_text: self.button_click(x))
            button.grid(row=row, column=col, padx=5, pady=5)
            if col == 3:
                col = 0
                row += 1
            else:
                col += 1
            # Bind keyboard keys
            self.master.bind('<Key>', self.key_press)

    def button_click(self, button):
        current = self.display.get()
        if button == 'C':
            self.display.delete(0, tk.END)
        elif button == '=':
            try:
                result = eval(current)
                self.display.delete(0, tk.END)
                self.display.insert(0, str(result))
            except SyntaxError:
                self.display.delete(0, tk.END)
                self.display.insert(0, "Error")
        else:
            self.display.delete(0, tk.END)
            self.display.insert(0, current + button)

    def key_press(self, event):
        key = event.char
        if key in '0123456789+-*/.':
            self.button_click(key)
        elif key == '\r':
            self.button_click('=')
        elif key == '\x1b': # Escape key
            self.display.delete(0, tk.END)

root = tk.Tk()
calculator = Calculator(root)
root.mainloop()

Unident def button_click и def key_press, значит они в классе, а не друг в друге, значит у вас, похоже, опечатка self.key.press

OneCricketeer 14.07.2024 01:18

Теперь он сообщает мне, что в файле self.master.bind('<Key>' self key.press) есть синтаксическая ошибка, и он думает, что ему не хватает запятой. Как мне это исправить?

DerpOKat21 14.07.2024 01:32

Непонятно, почему запятую убрали. self.key до сих пор нет. Функция называется self.key_press с подчеркиванием.

OneCricketeer 14.07.2024 01:34

Ох. Я это исправил, и теперь единственная проблема — это запятая.

DerpOKat21 14.07.2024 01:37

Какая запятая? self.master.bind('<Key>', self.key_press). Здесь два параметра, поэтому запятая нужна

OneCricketeer 14.07.2024 01:37

Я положил его обратно, и это вернуло проблему, возникшую ранее.

DerpOKat21 14.07.2024 01:39

Вам придется быть более конкретным. Если вы исправили подчеркивание, у вас больше не должно быть сообщения «не имеет атрибута «ключ». Вы не определили функции кнопок и клавиш? Вы можете отредактировать свой вопрос, чтобы отобразить изменения и полный журнал ошибок при запуске кода.

OneCricketeer 14.07.2024 01:42

Да, я их не опознал. Отсутствует «key_press»

DerpOKat21 14.07.2024 01:44

В вашем коде по-прежнему отображается button_click внутри функции инициализации и key_press внутри нее. Все функции должны быть с одинаковым отступом под классом, чтобы иметь одну и ту же ссылку self.

OneCricketeer 14.07.2024 01:59

Я не совсем уверен, что это значит. Есть ли способ, которым вы могли бы это упростить, или, возможно, я мог бы отправить вам ссылку на репозиторий GitHub и посмотреть, можете ли вы привести пример того, как мне это исправить.

DerpOKat21 14.07.2024 02:05

Если я возьму ваш код и исправлю отступ, чтобы все def выстроились в ряд, все будет работать нормально. gist.github.com/timrprobocom/e742f5ece1b3acd4d64245ffbf3127d‌​f

Tim Roberts 14.07.2024 02:05

У меня есть еще одна проблема. Это удвоение входов, а кнопка всего одна. Что об этом?

DerpOKat21 14.07.2024 02:09

У вас есть оба виджета «Кнопка умножения». Одной из них может быть кнопка «Очистить».

toyota Supra 14.07.2024 16:30

Что значит «у нас хорошо»?

TylerH 25.07.2024 20:10

«У нас все хорошо» означает, что проблема была устранена.

DerpOKat21 26.07.2024 21:09
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
15
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Помимо того, что ваш код не зависит от функций, ваша математика и управление потоком также имеют значение,

поскольку вы никогда не меняете номер столбца, вы останетесь на первой кнопке и сложите их одну за другой.

import tkinter as tk

class Calculator:
    def __init__(self, master):
        self.master = master
        master.title("Calculator")

        # Create display
        self.display = tk.Entry(master, width=35, borderwidth=5, font=('Arial', 16))
        self.display.grid(row=0, column=0, columnspan=4, padx=10, pady=10)

        # Create buttons
        button_list = [
            '7', '8', '9', '/',
            '4', '5', '6', '*',
            '1', '2', '3', '-',
            '0', '.', '=', '*'
        ]

        row = 1
        col = 0
        for button_text in button_list:
            button = tk.Button(master, text=button_text, width=5, height=2, font=('Arial', 14),
            command=lambda x=button_text: self.button_click(x))
            button.grid(row=row, column=col, padx=5, pady=5)
            if col == 3:
                col = 0
                row += 1
            else:
                col += 1
            # Bind keyboard keys
            self.master.bind('<Key>', self.key_press)

    def button_click(self, button):
        current = self.display.get()
        if button == 'C':
            self.display.delete(0, tk.END)
        elif button == '=':
            try:
                result = eval(current)
                self.display.delete(0, tk.END)
                self.display.insert(0, str(result))
            except SyntaxError:
                self.display.delete(0, tk.END)
                self.display.insert(0, "Error")
        else:
            self.display.delete(0, tk.END)
            self.display.insert(0, current + button)

    def key_press(self, event):
        key = event.char
        if key in '0123456789+-*/.':
            self.button_click(key)
        elif key == '\r':
            self.button_click('=')
        elif key == '\x1b': # Escape key
            self.display.delete(0, tk.END)

root = tk.Tk()
calculator = Calculator(root)
root.mainloop()

вы понимаете, что не должны исправлять вопрос, когда кто-то отвечает, вы принимаете ответ и продолжаете жить, см. stackoverflow.com/help/someone-answers

nbk 14.07.2024 02:49
command нигде и никогда не используется. Это необходимо?
OneCricketeer 14.07.2024 02:50

@OneCricketeer, он начинает с Python, и у него возникли проблемы, я думаю, что команда будет вставлена ​​позже

nbk 14.07.2024 02:52

@nbk Я никогда не использовал Stack Overflow, я не знаю, как принять ответ. Спасибо, что хотя бы напомнили мне, что делать в следующий раз.

DerpOKat21 14.07.2024 05:25

Другие вопросы по теме