У меня есть код ниже, который состоит из графического интерфейса программы и двух отдельных функций. Чтобы мой файл main.py оставался аккуратным, я хотел разделить свои функции на другие файлы. Однако, когда я делаю это и импортирую указанный файл в main.py, когда код запускается и я пытаюсь использовать события, связанные с импортированными функциями, я получаю сообщение об ошибке с надписью «app» undefined. Проблема в том, что я не уверен, как это определить в этом случае, чтобы он работал.
Вопрос: как определить приложение при использовании функций из другого файла?
Полная ошибка: Traceback (последний вызов последним): Файл "C: \ Users \ Jason Smit \ AppData \ Local \ Programs \ Python \ Python36-32 \ lib \ tkinter__init __. Py", строка 1702, в вызов вернуть self.func (* args) Файл "C: \ Users \ Jason Smit \ PycharmProjects \ Project-X \ venv \ lib \ site-packages \ appJar \ appjar.py", строка 3494, в вернуть лямбда * аргументы: funcName (параметр) Файл "C: \ Users \ Jason Smit \ PycharmProjects \ Project-X \ menu_events.py", строка 10, на панели инструментов если app.exitFullscreen (): NameError: имя 'приложение' не определено
from appJar import gui
# Global Constants:
FILE_MENUS = ["Open", "Save", "Save as...", "Export", "Close"]
HELP_MENUS = ["Help", "Getting Started", "Settings", "Submit Feedback", "About"]
def login(btn):
if btn == "Unlock":
app.infoBox("Success", "Access granted\n Welcome User")
app.hideSubWindow("Sub1")
app.show()
return
# Holds event handlers for toolbar
def toolbar(btn):
print(btn)
if btn == "LOGOUT":
app.hide()
app.showSubWindow("Sub1")
elif btn == "FULL-SCREEN":
if app.exitFullscreen():
app.setToolbarIcon("FULL-SCREEN", "FULL-SCREEN")
else:
app.setSize("fullscreen")
app.setToolbarIcon("FULL-SCREEN", "FULL-SCREEN-EXIT")
###################
# GUI starts here #
###################
with gui("Project-X", "1700x1000") as app:
app.setBg("white")
app.setIcon("app_icon.ico") # App icon
# Subwindow for user login
with app.subWindow("Sub1", "Login",):
app.setBg("white")
# Empty left container (To help get login in center.)
with app.frame("LEFT", row=0, column=0, sticky='NEW', stretch='COLUMN'):
""""""
# Login container/gui
with app.frame("CenterTop", row=0, column=1, sticky='NEW', stretch='column'):
app.setBg("white")
with app.labelFrame("Login"):
app.setBg("white")
app.setSticky("ew")
# Login widget setup
app.addLabel("Usr", "Name", 0, 0)
app.addEntry("Name", 0, 1)
app.addLabel("Pwd", "Password", 1, 0)
app.addSecretEntry("Password", 1, 1)
app.addNamedButton("Submit", "Unlock", login, 2, 0, 2)
# Empty right container (To help get login in center.)
with app.frame("RIGHT", row=0, column=2, sticky='NEW', stretch='COLUMN'):
""""""
# Top-level menu for main window
app.addMenuList("File", FILE_MENUS, toolbar)
app.addMenuList("Help", HELP_MENUS, toolbar)
# Main navigation Toolbar
app.addToolbar(["LOGOUT", "FULL-SCREEN"], toolbar, findIcon=True)
# Tabbed page for displaying info for each category
with app.tabbedFrame("Item Inventory"):
app.startTab("Category_1")
app.addLabel("l1", "Test for category tab 1")
app.stopTab()
app.startTab("Category_2")
app.addLabel("l2", "Test for category tab 2")
app.stopTab()
# Start application from login sub window
app.go(startWindow = "Sub1")
Функции login
и toolbar
относятся к объекту app
вне области действия строки with gui("Project-X", "1700x1000") as app:
. Таким образом, функции должны быть после этой строки with
с однократным отступом.
В качестве альтернативы вы можете передать объект приложения этим функциям, когда вы их вызываете, но это кажется обходным (и я не пробовал ничего подобного) - поскольку функции очень сильно о в интерфейсе пользователя, они должны быть в тот же файл, что и остальная часть графического интерфейса.
Спасибо, в этом есть смысл. Я думал, что если бы все мои функции графического интерфейса были в одном файле, это могло бы стать немного неуклюжим. Однако теперь я вижу, что иногда это просто то, с чем можно смириться :) Еще раз спасибо за ваш ответ. Я ценю его.