Ой-йой-йой…
Смотрите. У Вас набрались ошибки в коде:
1. Если для построения GUI используем ООП, то надо наследовать от рамки, т.е.
class Buts (tkinter.Frame):
#
def __init__(self, root=None):
super().__init__(self, root)
self.pack()
В этом случае главная рамка будет доступна в классе как self.
2. Этого делать никогда нельзя!!!
Прочитать, почему можно
вот здесь…3. Если у Вас много однотипных виджетов, то проще создавать и упаковывать их в цикле:
self.buttons_number = {}
name = [("7", "8", "9"), ("4", "5", "6"), ("1", "2", "3")]
for _ in name:
frm = tkinter.Frame(self)
frm.pack()
for btext in name:
but_vr = tkinter.Button(frm, text=btext)
but_vr.bind("<ButtonRelease-1>", call) # функция call описана в проблеме ниже :)
but_vr.pack(side="left")
self.buttons_numbers[btext] = but_vr
Таким образом у Вас получаются, что все ссылки на кнопки с цифрами собраны в словаре buttons_number, где ключом является текст внутри кнопки, а значением - ссылка на кнопку (которую можно дальше использовать). Такой же словарь для кнопок операций (только называете его, например, self.buttons_operations) тоже можно создать в цикле.
4. Вы меня явно не поняли
Это не простое решение - это костыль. Простое решение я Вам написал, но могу повторить.
def call(event):
if event.widget in self.button_operations.values(): # проверяем, что нажата одна из операций
if self.ent.get[-1] in [str(i) for i in range(10)]: # проверяем, что до нажатия операции в ent есть цифры использую индекс [-1]
self.ent.insert("end", event.widget["text"]) # добавляем в конец ent надпись на кнопке операций (* или - или + или /)
else: # нажата не кнопка операций, а просто кнопка цифр
self.ent.insert("end", event.widget["text"]) # вставляем в конец ent надпись на кнопке цифр
5. Заблокировать self.ent можно, указав для свойства “state” в значение “disabled”. Только тогда необходимо поиграться со свойствами “disabledbackground” и “disabledforeground” для того, чтобы при “state” = “disabled” self.ent выглядел так, как будто у него “state” = “normal” и не был серого цвета.
Единственное. В этом случае необходимо перед вставкой включать self.ent и после вставки данных выключать self.ent., т.е. функция приобретет вид:
def call(event):
if event.widget in self.button_operations_numbers.values():
if self.ent.get[-1] in [str(i) for i in range(10)]:
self.ent["state"] = "normal" # включаем, чтобы вставить виджет
self.ent.insert("end", event.widget["text"])
self.ent["state"] = "disabled" # снова блокируем
else:
self.ent["state"] = "normal"
self.ent.insert("end", event.widget["text"])
self.ent["state"] = "disabled"
Чтобы не играться со свойствами “disabledbackground” и “disabledforeground” можно использовать другое состояние (“readonly”). В этом случае тоже необходимо включать и выключать состояние в функции call, но виджет при отключении выглядит так же, как и при “state” = “normal”, т.е. не “сереет”.
P.S. Будут вопросы - пишите…