Изменить переменную с помощью кнопки tkinter - PullRequest
1 голос
/ 01 июня 2019

У меня какая-то проблема со структурой в моем коде.Я использую Tkinter и строю графический интерфейс.Моя идея заключается в следующем: есть поле, которое принимает путь к файлу, и когда вы нажимаете кнопку Пуск, Python открывает путь и загружает файл как CSV.Затем он сохраняет файл в dict с некоторой дополнительной информацией и возвращает dict, который будет передан другим функциям.Однако как это может работать?Кнопка может только запускать функцию, но не возвращать что-то, верно?

Таким образом, я могу ввести (частично заполненный) dict в качестве аргумента этой функции ввода, однако он никогда не возвращается.До сих пор моим решением было объявить его глобальным, поэтому, когда он изменяется внутри функции, он также изменяется и снаружи.Однако теперь я реструктурирую код и хочу использовать его повторно (поскольку файлы импортируются на нескольких этапах процесса).Теперь, когда я хочу снова использовать ту же функцию, глобальное решение кажется проблематичным.Любые идеи, как я могу сделать это без них?Большое спасибо.

Обновление1:

class Topclass:
    def changer(x):
        x += 1


class Subclass(Topclass):
    def __init__(self):
        self.b = 2


obb = Subclass()
print(obb.b)
Topclass.changer(obb.b)
print(obb.b)

1 Ответ

1 голос
/ 01 июня 2019

@ Совет Мартино правилен, есть много чему поучиться у @ BryanOakley * Лучший способ структурировать приложение tkinter .

Использование DataTransfer специализированного объекта - техникакоторые вы можете использовать для передачи переменных или данных, с помощью каркасов, которые не возвращают значений, таких как tkinter, или когда вам нужно, чтобы ваши данные пересекли барьер инкапсуляции, без тесной связи между задействованными объектами:

Здесьпростой пример, иллюстрирующий, как это работает:

class DataTransfer:
    """mutable object that is used to transfer data
    """
    def __init__(self, value: int) -> None:
        self.value = value

    def add_one(self) -> None:
        self.value += 1

    def __str__(self) -> str:
        return f'{self.value}'


class Topclass:
    def changer(x: DataTransfer) -> None:
        x.add_one()


class Subclass(Topclass):
    def __init__(self) -> None:
        self.b = DataTransfer(2)


obb = Subclass()
print(obb.b)
Topclass.changer(obb.b)
print(obb.b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...