Seite 1 von 1

Probleme mit Wizard

Verfasst: Dienstag 2. Dezember 2008, 20:23
von marlboro1980
Hallo,

mein Problem ist das folgende:

Ich spiele auf dedicated servern Civ4, diese werden über eine .exe gestartet die wiederrum auf ein .py zugreift. Nur leider gibt es etliche Probleme mit den Server, was es notwendig macht sie regelmäßig neuzustarten. Das geht aber nur manuell über einen Wizard. Ziel ist es die .py insoweit umzuschreiben das er nach ausführung der .exe automatisch das ensprechende Savegame lädt.

Ich bin leider immer noch nicht wirklich bewandert in python, aber
Im folgenden Code habe ich zumindest die Currpage auf loadselect gesetzt womit der Wizard in dieser Stelle startet. Da der Wizard nachdem man auf Spiel laden geklickt hat alle weiteren Schritte überspringt ist nur die Klasse loadselect relevant.

So die für mich weiteren Schritte wäre jetzt:

1. Die Variable path einen festen wert zu Übergeben "c:\test.save" ohne den fileDialog

2. Dem Passwort einen festen Wert zu übergeben "test" ohne die box

3. den Ladevorgang zu initieren ohne auf next klicken zu müssen damit ich nur noch die .exe ausführen muss.

Nur jedesmal wenn ich Anfange und die dialogboxen durch feste Werte ersetze bricht die Bearbeitung ab, vermutlich wegen diverser Syntaxfehler bzw. falsch übergebener Werte.

Wie ich den Eventhandler umgehe damit ich nicht auf next klicken muss ist mir erlichgesagt nicht ersichtlich

[Edit (Leonidas): 1452 Zeilen fürchterlichen Code ausgelagert]

Verfasst: Dienstag 2. Dezember 2008, 21:08
von audax
Der Code ist direkt von dem Spiel?
Dann weiß ich nicht, ob es ne gute Idee ist, den Code hier zu posten....

Verfasst: Mittwoch 3. Dezember 2008, 10:29
von marlboro1980
Danke erstmal fürs auslagern, auf den ersten Blick sah es nicht nach soviel aus.

@ Über mir: Civ4 wurde extra so programmiert das modifizierbar ist, ein großteil des Spiels ist in XML und Python, zudem kannst du dir den Code + die .exe auf der Homepage downloaden.

Das dürfte der relevante Teil sein. Ich habe nochmal weiter rumprobiert bin aber nicht wirklich weitergekommen

Code: Alles auswählen

class LoadSelectPage(wx.wizard.PyWizardPage):
	def __init__(self, parent):
		wx.wizard.PyWizardPage.__init__(self, parent)
		self.next = self.prev = None
		self.myParent = parent
		
		# Place the radio buttons
		selections = [localText.getText("TXT_KEY_PITBOSS_NEWGAME", ()), localText.getText("TXT_KEY_PITBOSS_SCENARIO", ()), localText.getText("TXT_KEY_PITBOSS_LOADGAME", ())]
		sizer = wx.BoxSizer(wx.VERTICAL)
		self.rb = wx.RadioBox(
					self, -1, (localText.getText("TXT_KEY_PITBOSS_SELECT_INIT", ())), wx.DefaultPosition, wx.DefaultSize,
					selections, 1, wx.RA_SPECIFY_COLS
					)
				
		self.rb.SetToolTip(wx.ToolTip((localText.getText("TXT_KEY_PITBOSS_SELECT_INIT_HELP", ()))))
		sizer.Add(self.rb, 0, wx.ALL, 5)
		
		self.SetSizer(sizer)
		
		self.Bind(wx.wizard.EVT_WIZARD_PAGE_CHANGED, self.OnPageChanged)
		self.Bind(wx.wizard.EVT_WIZARD_PAGE_CHANGING, self.OnPageChanging)
		
	def enableButtons(self):
		# If the patch state is ok, enable appropriate buttons
		global bPatchConfirmed
		
		self.myParent.FindWindowById(wx.ID_FORWARD).Enable(bPatchConfirmed)
		self.myParent.FindWindowById(wx.ID_BACKWARD).Enable(bPatchConfirmed)

Code: Alles auswählen

def OnPageChanged(self, event):
		global curPage
		
		# If we haven't already, check for a patch
		global bPatchConfirmed
		if (not bPatchConfirmed):
			if (not PB.checkPatch()):
				# Error in checking for a patch
				msg = wx.MessageBox(localText.getText("TXT_KEY_PITBOSS_PATCH_CHECK_ERROR_DESC", ()), localText.getText("TXT_KEY_PITBOSS_PATCH_CHECK_ERROR_TITLE", ()), wx.ICON_ERROR)
				bPatchConfirmed = true
				
		# Determine what buttons should be enabled
		self.enableButtons()
		
		curPage = self
		
	def SetNext(self, next):
		self.next = next
		
	def SetPrev(self, prev):
		self.prev = prev
		
	def GetNext(self):
		"Determine which page to display next"
		next = self.next
		
		if (self.rb.GetSelection() == 0):
			# If it's a new game, skip the scenario selector
			next = next.GetNext()
		if (self.rb.GetSelection() == 2):
			# If it's a loaded game, launch now
			next = None
			
		return next
		
	def GetPrev(self):
		return self.prev
			
	def OnPageChanging(self, event):
		
		global bSaved
		global bScenario
		
		# Check direction
		if event.GetDirection():
		
			# We are trying to move forward - are we trying to init'ing or loading game?
			if (self.rb.GetSelection() == 2):
				# Loading a game - popup the file browser
				bScenario = false
				dlg = wx.FileDialog(
					self, message=(localText.getText("TXT_KEY_PITBOSS_CHOOSE_SAVE", ())), defaultDir=".\saves\multi",
					defaultFile="", wildcard=localText.getText("TXT_KEY_PITBOSS_SAVE_FILES", ("(*.Civ4SavedGame)|*.Civ4SavedGame", )), style=wx.OPEN
					)
				
				# Show the modal dialog and get the response
				if dlg.ShowModal() == wx.ID_OK:
					# Get the file name
					path = dlg.GetPath()
					if (path != ""):
						# Prompt for admin password
						dlg = wx.TextEntryDialog(
							self, localText.getText("TXT_KEY_MAIN_MENU_CIV_ADMINPWD_DESC", ()),
							localText.getText("TXT_MAIN_MENU_CIV_PASSWORD_TITLEBAR", ()))
							
						# Show the modal dialog and get the response
						if dlg.ShowModal() == wx.ID_OK:
							# Check the game name
							adminPwd = dlg.GetValue()
								
							# We got a save file - try to load the setup info
							iResult = PB.load(path, adminPwd)
							if ( iResult != 0 ):
								# Loading setup info failed.  Clean up and exit
								if (iResult == 1):
									msg = wx.MessageBox((localText.getText("TXT_KEY_PITBOSS_ERROR_LOADING", ())), (localText.getText("TXT_KEY_PITBOSS_LOAD_ERROR", ())), wx.ICON_ERROR )
								elif (iResult == -1):
									msg = wx.MessageBox((localText.getText("TXT_MAIN_MENU_CIV_PASSWORD_RETRY_DESC", ())), (localText.getText("TXT_KEY_BAD_PASSWORD_TITLE", ())), wx.ICON_ERROR )
								PB.reset()
								event.Veto()
							else:
								# Successfully loaded, try hosting
								PB.setLoadFileName(path)
								if ( not PB.host(bPublic, bScenario) ):
									msg = wx.MessageBox( (localText.getText("TXT_KEY_PITBOSS_ERROR_HOSTING", ())), (localText.getText("TXT_KEY_PITBOSS_HOST_ERROR", ())), wx.ICON_ERROR )
									PB.reset()
									event.Veto()
								else:
									bSaved = True
						else:
							# User cancelled admin password
							PB.reset()
							event.Veto()
							
					else:
						# Didn't get a save file - veto the page change
						event.Veto()
						
				else:
					#User hit cancel - veto the page change
					event.Veto()
					
				# Destroy the dialog
				dlg.Destroy()
				
			else:
				bSaved = false
[/code]

Verfasst: Donnerstag 4. Dezember 2008, 09:44
von marlboro1980
Hat keiner einen Ansatz wie ich die Schleife rausnehmen kann und die 2 Variablen fest definieren kann ?