@Feor_slen

Кнопка и окно ввода в разных классах, не получается добавить кнопке возможность вставлять знаки в Entry объект?

(ниже я привожу конкретно проблемные кусочки кода)
class inputBox(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent)
        self['background'] = "red"
        self.put_wigets()

    def put_wigets(self, *char):
        Ent_numberBox = tk.Entry(master=self, justify= tk.RIGHT, width=22)
        Lbl_instructionText = tk.Label(master=self, bg = self['background'],height=3 ,text="Введите мат. выражение:")

        Ent_numberBox.pack(side=tk.RIGHT, padx= 10, pady=15)
        Lbl_instructionText.pack(side=tk.LEFT)
        instruction = str(char)
        if instruction in "=→AC":
            pass
        elif instruction in "1234567890.!log*/-+":
            Ent_numberBox.insert(0, instruction)


class mathButton1(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent)
        self['background'] = "green"
        self['height'] = 50
        self.put_buttoms()


    def write(self, char):
        write = inputBox(tk)
        write.put_wigets(char)


    def put_buttoms(self):
        nameButtom = ["=", "AC", "→", "log", "!"]
        for i in range(5): #разметим кнопки с помощью цикла
            Button = tk.Button( master=self, width=4, command=lambda i=i:self.write(i), text=nameButtom[i])
            Button.grid(row= 0, column=i, pady=7, padx=11)


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

def put_buttoms(self):
        nameButtom = ["=", "AC", "→", "log", "!"]
        for i in range(5): #разметим кнопки с помощью цикла
            Button = tk.Button( master=self, width=4, command=lambda i=i:self.write(i), text=nameButtom[i])
            Button.grid(row= 0, column=i, pady=7, padx=11)

    def write(self, char):
        write = inputBox(tk)
        write.put_wigets(char)


В целом я не понимаю как это вменяемо реализовать поэтому сделал вот этот кринж

def put_wigets(self, *char):
        Ent_numberBox = tk.Entry(master=self, justify= tk.RIGHT, width=22)
        Lbl_instructionText = tk.Label(master=self, bg = self['background'],height=3 ,text="Введите мат. выражение:")

        Ent_numberBox.pack(side=tk.RIGHT, padx= 10, pady=15)
        Lbl_instructionText.pack(side=tk.LEFT)

        instruction = str(char)
        if instruction in "=→AC":
            pass
        elif instruction in "1234567890.!log*/-+":
            Ent_numberBox.insert(0, instruction)


вот ошибка: TypeError: inputBox.__init__() missing 1 required positional argument: 'parent'
я понимаю чего хочет программа но не знаю как корректно передать запрашиваемую информацию. Можно не исправлять ошибку, просто подскажите как решить задачу... Это должен был быть калькулятор

Кстати если я передаю в parent имена классов, библиотек или ещё какую чушь то получаю вот это: AttributeError: type object 'inputBox' has no attribute 'tk'
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Во-первых, какой виджет за что отвечает? Что такое inputBox? В чём его роль? В идеале одним предложением.

Во-вторых, не следует лазать в кишки класса без нужды. Вместо этого имеет смысл добавить этому классу удобный метод, который сделает всё что нужно, с пониманием внутреннего устройства класса. Тогда те, кто класс использует, не должны будут знать его внутреннее устройство - только его видимый интерфейс (методы, свойства). Это называется инкапсуляция.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы