Если вы хотите, чтобы runpayroll
имел доступ к name
, вы должны передать его в качестве аргумента.
Но большая проблема в том, что у вас, похоже, нет name
чтобы передать его в первую очередь.
Единственное, что вы назвали name
в любом месте, - это локальная переменная в этой функции getname()
, которую нельзя использовать вне этой функции.Все, что вы делаете с ним, это return name
, но вызывающая сторона ничего не делает с возвращаемым значением, потому что это просто обратный вызов команды Tkinter.
Вам нужно подумать, где вы хотите хранить эти вещи.Обычный ответ - создать класс - либо подкласс Notebook
, либо класс «контроллера», которому принадлежит Notebook
, - и хранить вещи как переменные экземпляра.В качестве альтернативы, вы можете избежать хранения глобальных (или нелокальных) переменных.Но, как бы вы ни решили это сделать, кто-то должен присвоить значение этому экземпляру или глобальной переменной где-нибудь.И затем, вы можете передать его на run_payroll
.
В этом случае у вас, кажется, уже есть класс MyNotebook
, и вы создаете его экземпляр, так что, возможно, это правильное место дляхранить вещи.
Пока мы на этом, нет никакой причины return
что-либо от функции, вызывающая сторона просто игнорирует результаты.А также вам не нужно lambda: payroll()
;Вы можете просто использовать payroll
для того же эффекта, но более читабельно (и даже более эффективно).
Итак:
def create_notebook(self, names):
nb = MyNotebook(self, names)
nb.pack()
# …
def payroll():
nb.pr = dataframes.runpayroll(nb.name)
def getname():
nb.name = filedialog.askopenfilename(title="Select file",
filetypes=(("excel
files", "*.xls"), ("all files", "*.*")))
# …
А теперь просто измените runpayroll
, чтобы использовать этозначение:
def runpayroll(name):
df_sar = pd.read_excel(name,
sheet_name=0, header=None, skiprows=4)