При попытке создать калькулятор на 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()
Теперь он сообщает мне, что в файле self.master.bind('<Key>' self key.press) есть синтаксическая ошибка, и он думает, что ему не хватает запятой. Как мне это исправить?
Непонятно, почему запятую убрали. self.key
до сих пор нет. Функция называется self.key_press
с подчеркиванием.
Ох. Я это исправил, и теперь единственная проблема — это запятая.
Какая запятая? self.master.bind('<Key>', self.key_press)
. Здесь два параметра, поэтому запятая нужна
Я положил его обратно, и это вернуло проблему, возникшую ранее.
Вам придется быть более конкретным. Если вы исправили подчеркивание, у вас больше не должно быть сообщения «не имеет атрибута «ключ». Вы не определили функции кнопок и клавиш? Вы можете отредактировать свой вопрос, чтобы отобразить изменения и полный журнал ошибок при запуске кода.
Да, я их не опознал. Отсутствует «key_press»
В вашем коде по-прежнему отображается button_click внутри функции инициализации и key_press внутри нее. Все функции должны быть с одинаковым отступом под классом, чтобы иметь одну и ту же ссылку self
.
Я не совсем уверен, что это значит. Есть ли способ, которым вы могли бы это упростить, или, возможно, я мог бы отправить вам ссылку на репозиторий GitHub и посмотреть, можете ли вы привести пример того, как мне это исправить.
Если я возьму ваш код и исправлю отступ, чтобы все def
выстроились в ряд, все будет работать нормально. gist.github.com/timrprobocom/e742f5ece1b3acd4d64245ffbf3127df
У меня есть еще одна проблема. Это удвоение входов, а кнопка всего одна. Что об этом?
У вас есть оба виджета «Кнопка умножения». Одной из них может быть кнопка «Очистить».
Что значит «у нас хорошо»?
«У нас все хорошо» означает, что проблема была устранена.
Помимо того, что ваш код не зависит от функций, ваша математика и управление потоком также имеют значение,
поскольку вы никогда не меняете номер столбца, вы останетесь на первой кнопке и сложите их одну за другой.
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
command
нигде и никогда не используется. Это необходимо?
@OneCricketeer, он начинает с Python, и у него возникли проблемы, я думаю, что команда будет вставлена позже
@nbk Я никогда не использовал Stack Overflow, я не знаю, как принять ответ. Спасибо, что хотя бы напомнили мне, что делать в следующий раз.
Unident
def button_click
иdef key_press
, значит они в классе, а не друг в друге, значит у вас, похоже, опечаткаself.key.press