Вопрос:
У меня возникает несколько проблем, вызывая функции Python, определенные в другом скрипте с помощью tkinter. Я бы предпочел иметь отдельный скрипт для моих функций, который графический интерфейс использует, когда это необходимо. На данный момент я делаю это так.
ttk.Button(mainframe, text=»1″, command=one).grid(column=1, row=1, sticky=NW) def one(): code_entry.insert(END,»1″)
Вышеупомянутая команда вызывает одно нажатие кнопки, которое печатает символ в поле ввода с графическим интерфейсом. Я думал, что могу создать отдельный скрипт для хранения своих функций и вызвать их следующим образом:
ttk.Button(mainframe, text=»1″, command=functions.one()).grid(column=1, row=1, sticky=NW)
А затем просто добавьте оператор импорта вверху моего графического интерфейса, как показано ниже:
import functions
Это не работает и ищет некоторые советы о том, как подойти к этому.
Лучший ответ:
Вы не указали никаких сообщений об ошибках, но, скорее всего, вы делаете fuctions.one() – на самом деле вызываете функцию one() этого модуля до создания Button. Он просто фиксируется путем удаления части() – когда вы указываете функцию без(), вы передаете ссылку объекта функции.
Также имейте в виду область действия переменной code_entry – если вы использовали ее как глобальный уровень модуля до (или функции local, если one() был внутри той же функции, что и ваш вызов ttk.Button), он не будет доступен когда вы переместите его в новое пространство имен без code_entry.
Чтобы решить эту проблему, вы должны передать code_entry в качестве параметра для обратного вызова, не вызвав сначала one(). Обычный подход для этого – создание лямбда – по существу создание функции, которая работает в той же области исходного one(), имеющей доступ к переменным типа code_entry, но также вызывающим функцию в другом модуле.
ttk.Button(mainframe, text=»1″, command=lambda: functions.one(code_entry))
Обратите внимание, что это в основном то же самое, что:
def some_anonymous_function(): functions.one(code_entry) ttk.Button(mainframe, text=»1″, command=some_anonymous_function)
Оба примера создают объект функции и передают этот объект как ссылку – вызов functions.one() лямбда фактически находится внутри тела лямбда-функции, которая будет называться позже tkinter.
Конечно, вы также должны переопределить one(), чтобы принять этот новый параметр:
def one(code_entry): code_entry.insert(END,»1″)