@Feor_slen

Метод insert не работает, как исправить?

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)
        if char == "":
            pass
        else:
            print(char)
            Ent_numberBox.insert(0, char)
            char = ""


Класс это фрейм калькулятора. Чар - переменная в которую из другого класса (это законно? Или кринж?) при нажатии кнопки передаётся символ. Этот символ методом insert должен возникнуть в энтри объекте. В чаре лежит строка, но несмотря что нужный кусок кода запускается в строке ничего не появляется че делать не знаю.
  • Вопрос задан
  • 182 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Ну тут сразу возникает вопрос: какую задачу выполняет этот метод. Ты говоришь, что метод используется другим классом. Окей, это норма. Для чего он используется? Какую задачу другой класс хочет решить вызовом этого метода?
Вопрос связан с тем, что ты почему-то создаёшь элементы управления в методе put_wigets(). По идее, если твой класс представляет собой группу элементов управления, он должен создавать дочерние элементы в своём конструкторе, и сохранять ссылки на них в приватные (ну, насколько это можно в питоне) поля класса. Методы класса должны к этим полям обращаться. Исходи из того, что локальная переменная в методе (как Ent_numberBox ) живёт только во время вызова этого метода, и не должна содержать ничего, что переживёт этот метод (если это не возвращаемое значение).

Например, так:
import tkinter as tk

class InputBox(tk.Frame):
    def __init__(self, master, **kwargs):
        # вызываем унаследованный конструктор
        super().__init__(master, **kwargs)
        # переменные tkinter можно связывать с элементами управления
        # тогда изменение в переменной отобразится в элементе, и наоборот
        # это бывает удобнее, чем дёргать элемент напрямую
        # а ещё можно самим реагировать на изменения значения такой переменной
        self.__value = tk.StringVar()
        # наше поле ввода
        self.__entry = tk.Entry(self, justify=tk.RIGHT, width=22, textvariable=self.__value)
        self.__entry.pack(side=tk.RIGHT, padx=10, pady=15)
        # метка с пояснением
        self.__helptext = tk.Label(self, bg=self['background'], height=3, text="Введите мат. выражение:")
        self.__helptext.pack(side=tk.LEFT)
    
    def get_value(self) -> str:
        """Возвращает введённую строку."""
        return self.__value.get()  # метод get() позволяет прочитать значение переменной tkinter
    
    def set_value(self, value: str) -> None:
        """Заменяет содержимое введённой строки новым."""
        self.__value.set(value)  # метод set() позволяет задать новое значение для переменной
        
    def append(self, symbol: str) -> None:
        """Добавляет символ(ы) к уже введённой строке."""
        self.__value.set(self.__value.get() + symbol)


if __name__ == '__main__':
    root = tk.Tk()
    box = InputBox(root)
    box.pack(side=tk.TOP, expand=True, fill=tk.BOTH)
    box.set_value('Hello')
    box.append(', world!')
    root.mainloop()


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

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

Войти через центр авторизации
Похожие вопросы