"приложение" из appJar не определено при использовании функций из отдельного модуля

У меня есть код ниже, который состоит из графического интерфейса программы и двух отдельных функций. Чтобы мой файл 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")
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
224
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функции login и toolbar относятся к объекту app вне области действия строки with gui("Project-X", "1700x1000") as app:. Таким образом, функции должны быть после этой строки with с однократным отступом.

В качестве альтернативы вы можете передать объект приложения этим функциям, когда вы их вызываете, но это кажется обходным (и я не пробовал ничего подобного) - поскольку функции очень сильно о в интерфейсе пользователя, они должны быть в тот же файл, что и остальная часть графического интерфейса.

Спасибо, в этом есть смысл. Я думал, что если бы все мои функции графического интерфейса были в одном файле, это могло бы стать немного неуклюжим. Однако теперь я вижу, что иногда это просто то, с чем можно смириться :) Еще раз спасибо за ваш ответ. Я ценю его.

Jason Michael Smit 16.05.2018 13:52

Другие вопросы по теме