私はあなたができることを持っています.engine.setState(<state class>)
それはあなたが与えたクラスタイプをインスタンス化し、新しい状態で実行を開始します.
にはSelectFileState
に行くボタンがNewFileState
ありNewFileState
、 には に戻るボタンがありますSelectFileState
。
さて、 の冒頭でSelectFileState
、私はインポートしてNewFileState
います (したがって、後でクラスで行うことができますengine.setState(NewFileState)
。 の冒頭でNewFileState
、私もインポートしていSelectFileState
ます (したがって、後で に戻ることができますSelectFileState
)。
ただし、他の投稿で説明されているように、これにより循環インポートが作成されます。循環インポートは設計が悪いことを示しており、リファクタリングする必要があると言う人もいます..
使用する直前にインポートすることでこの問題を解決できることはわかっていSelectFileState
ますが、正しい方法でリファクタリングしたいと思います。
今、私は疑問に思っています..それをどのようにリファクタリングしますか?
ありがとう。
編集: Pydsignerは、2つのファイルを1つにマージすることを提案しています.2つのファイルは互いに非常に関連しているためです。ただし、循環依存関係を持つすべての状態を 1 つのファイルに入れることはできないため、そのためのより良い方法が必要です。何か案は?
2編集:
構文を使用せずfrom x import y
、代わりにimport x
. これは望ましい解決策ではありません。この種のことを修正する「Pythonic」の方法を知りたいです。ファイルをマージするだけでは、永久に解決することはできません。
コード:
SelectFileState
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
NewFileState
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)