繁体   English   中英

仅当模块存在时,如何从模块导入 class 的实例

[英]How to import an instance of a class from a module only if it exists

我正在做的项目是塔防级别编辑器。 我认为对于这个问题,了解结构很重要。所以基本上,我们可以有很多项目,每个项目可以容纳很多塔。 我正在制作 GUI,特别是滑块。 我想加载用户上次退出程序时滑块所持有的值。 为此,这些值存储在文本文件中。 为了装载塔,我有一个 class。

class Workspace:
    def __init__(self):
        t = file.loadtowers(project.getprojectname())
        for tower in t:
            if tower.name == project.tower:
                self.speedslider = Slider([990, 10], text="Attack Speed/ s", start=int(tower.attackspeed), factor=40)
                self.damageslider = Slider([990, 50], text="Attack Damage", start=int(tower.damage))
                self.radiusslider = Slider([990, 90], text="Range Radius", start=int(tower.radius))
                self.levelslider = Slider([990, 130], text="Max Level", start=int(tower.max), factor=5)
                step = literal_eval(tower.step)
                self.step = [TickBox(text="Damage", value=step[0]), TickBox(text="Range", value=step[1])
                             , TickBox(text="Attack speed", value=step[2])]
                stepupby = literal_eval(tower.stepupby)
                self.damagestep = Slider([990, 340], text="Attack Damage", start=int(stepupby[0]))
                self.radiusstep = Slider([990, 380], text="Range Radius", start=int(stepupby[1]))
                self.attackspeed = Slider([990, 420], text="Attack Speed", start=int(stepupby[2]))
                self.chooseimage = RectButton(text="Choose Image", border=True)
                self.savebutton = RectButton(text="Save", border=True)

我想在实例化 class 时加载值,因为我只想加载一次值,然后让用户更改它们。 但是,我的问题是我只能在用户选择塔后实例化 class,因为我需要知道用户想要在哪个塔上工作。

def openproject(self):
        for b in self.buttons:
            if b.clicked():
                project.settower(b.text)
                global towerworkspace
                towerworkspace = Workspace()
                state.active = "tower workspace"

但是现在,我在main.py中遇到了一个导入错误,因为只有在towerworkspace运行时才定义了openproject 那么我将如何解决这个问题呢? 使用 function 会使一切变得更简单,但我想不出一种只加载一次值的方法,因为 function 必须处于循环中。 只有在创建之后导入towerworkspace理想的,但我不知道该怎么做。 感谢您的帮助

main.py

import pygame
import sys
from time import time
from home import home
from createproject import createproject, existingprojects
from towerworkspace import towerhome, towerworkspace

from GUI import popup
from States import state


class Editor:
    def __init__(self, winWidth, winHeight):
        self.win = pygame.display 

        self.display = self.win.set_mode((winWidth, winHeight)) #Initialize the pygame window with given size
        self.win.set_caption("A Level computer science project - Level Editor") #Set title for the window


editor = Editor(1200, 600)# Instantiation of Editor class with values 1200, 600 which is used as the screen size

# This function accepts event queue from the operating system as an argument and if one of those events is pygame.QUIT it exits the program.
def handleExit(events):
    for e in events:
        if e.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

def render():
    editor.display.fill((100, 100, 100)) # Fills the window with a grey-ish color every frame, which is the background
    if state.active == "create project":
        createproject.render(editor.display)
        existingprojects.render(editor.display)
    if state.active == "home":
        home.render(editor.display)
    if state.active == "tower home":
        towerhome.render(editor.display)
    if state.active == "tower workspace":
        towerworkspace.render(editor.display)

    popup.popup(editor.display)
    

def logic(events, window):        
    if state.active == "create project":
        createproject.logic(events, window)
        createproject.feedevents(events)
        existingprojects.logic(events)
        existingprojects.refresh()
    if state.active == "home":
        home.logic()
    if state.active == "tower home":
        towerhome.feedevents(events)
        towerhome.logic(events)
        towerhome.openproject()
        towerhome.refresh()
    if state.active == "tower workspace":
        towerworkspace.feedevents(events)
        towerworkspace.updatevalues(events)
    popup.handleactive()
 

# The application loop
while True:
    events = pygame.event.get() #  Request event queue from the operating system
    popup.handleactive()
    handleExit(events)
    render()
    logic(events, editor.display)
    editor.win.flip()

错误:

 ImportError: cannot import name 'towerworkspace' from 'towerworkspace' 

从顶部的导入中删除 towerworkspace 并在用户单击后使用它,如下所示:

    if state.active == "tower workspace":
        from towerworkspace import towerworkspace
        towerworkspace.feedevents(events)
        towerworkspace.updatevalues(events)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM