我有一个你可以做的事情,engine.setState(<state class>)
它会实例化你给它的类类型并开始在新状态下运行。
里面有SelectFileState
一个按钮可以去NewFileState
,on NewFileState
,有一个按钮可以返回SelectFileState
。
现在,在开始时SelectFileState
,我正在导入NewFileState
(所以我可以稍后在课堂上做engine.setState(NewFileState)
。在开始时NewFileState
,我也在导入SelectFileState
(所以我以后可以回到SelectFileState
)。
但是,这会创建循环导入,如其他一些帖子中所述。有人说循环导入表明设计不好,应该重构。
我知道我可以通过SelectFileState
在需要使用它之前直接导入来解决这个问题,但我宁愿以正确的方式做事并重构它。
现在我想知道..你会如何重构它?
谢谢。
编辑: Pydsigner 建议我将这两个文件合并为一个,因为它们彼此非常相关。但是,我不能将每个具有循环依赖关系的状态都放入一个文件中,因此必须有一种更好的方法。有任何想法吗?
2编辑:
我现在通过不使用from x import y
语法来规避这个问题,而只是做import x
. 这不是一个可取的解决方案,我想知道解决这种事情的“Pythonic”方式。只是将文件合并在一起不能永远解决问题。
编码:
选择文件状态
from states.state import State
from states.newfilestate import NewFileState
from elements.poster import Poster
from elements.label import Label
from elements.button import Button
from elements.trifader import TriFader
import glob
import os
class SelectFileState(State):
def __init__(self, engine):
super().__init__(engine)
def create(self):
self.engine.createElement((0, 0), Poster(self.engine.getImage('gui_loadsave')), 1)
self.engine.createElement((168, 30), Label("Load a game", 40), 2)
self.engine.createElement((400, 470), Button("New save", code=self.engine.createElement, args=((0, 0), TriFader(NewFileState, False), -240)), 3)
ycounter = 150
globs = glob.glob("save\\*.mcw")
for file in globs:
self.engine.createElement((200, ycounter), Button(os.path.basename(file)[:-4]), 2)
ycounter += 50
新文件状态
from states.state import State
from states.selectfilestate import SelectFileState
from elements.poster import Poster
from elements.label import Label
from elements.button import Button
from elements.inputbox import InputBox
from elements.trifader import TriFader
class NewFileState(State):
def __init__(self, engine):
super().__init__(engine)
def create(self):
self.engine.createElement((0, 0), Poster(self.engine.getImage('gui_loadsave')), 1)
self.engine.createElement((135, 30), Label("Make a new save", 40), 2)
self.lvlname = self.engine.createElement((180, 212), InputBox(length=25, text="World name"), 2)
self.engine.createElement((200, 240), Button(text="Ok", code=self.createSave, args=()), 2)
def createSave(self):
open("save\\" + self.lvlname.getText() + ".mcw", 'w')
self.engine.createElement((0, 0), TriFader(SelectFileState), -240)