Seite 1 von 1

Programm neustarten

Verfasst: Dienstag 27. März 2007, 17:07
von DHK
Hi,
ist es mit wxPython möglich, ein Programm neustarten zu lassen? Z. B. Ein Dialogfeld fragt den Anwender, ob er das Programm neustarten möchte. Der Anwender klickt auf "Ja". Nun soll das Programm beendet werden und wieder neu geöffnet werden. Ist so etwas möglich? Wenn ja, wie?

Gruß

DHK

Verfasst: Dienstag 27. März 2007, 18:09
von DatenMetzgerX
das würde ich mit einem 2ten python script lösen. Die Anwendung ruft das python script auf und beendet sich selbst. Das script schaut immer, ob die Anwendung noch geöffnet ist, wenn dies nicht mehr der Fall ist startet es die Anwendung.

Verfasst: Mittwoch 28. März 2007, 16:30
von DHK
Hallo, vielen Dank für deinen Tipp. Ich habe noch eine Frage. Habe folgenden Code:

Code: Alles auswählen

# .....
    def OnChooseSkin(self, event):
        inuse = file('skindata/inuse.txt', 'w')
        inuse.write(string.lower(selected))
        inuse.close()
        dlg = wx.MessageDialog(self, dialog['skinchosen'], dialog['skinchosentitle'], wx.YES | wx.NO)
        self.Bind(wx.EVT_BUTTON, self.OnJa, id=wx.ID_YES)
        dlg.ShowModal()
        dlg.Destroy()


    def OnJa(self, event):
        print "Hello"
Problem: Die Funktion OnJa() wird nicht aufgerufen. Wenn ich auf den Ja-Button drücke, müsste normalerweise "Hello" ausgegeben werden. Wird es aber nicht. Was habe ich falsch gemacht?

Gruß

DHK

Verfasst: Mittwoch 28. März 2007, 19:36
von name
Machs doch einfach mit:

Code: Alles auswählen

...
dlg = wx.MessageDialog(self, dialog['skinchosen'], dialog['skinchosentitle'], wx.YES | wx.NO)
dlg_value = dlg.ShowModal()
if dlg_value == wx.ID_YES:
 print "Hello"
...
beziehungsweise:

Code: Alles auswählen

...
 dlg = wx.MessageDialog(self, dialog['skinchosen'], dialog['skinchosentitle'], wx.YES | wx.NO)
 dlg_value = dlg.ShowModal()
 if dlg_value == wx.ID_YES:
  self.OnJa()
 ...
 def OnJa(self):
  print "Hello"

Verfasst: Donnerstag 29. März 2007, 12:56
von DHK
Danke, name. Hast mir sehr geholfen.
DatenMetzgerX hat geschrieben:das würde ich mit einem 2ten python script lösen. Die Anwendung ruft das python script auf und beendet sich selbst. Das script schaut immer, ob die Anwendung noch geöffnet ist, wenn dies nicht mehr der Fall ist startet es die Anwendung.
Hallo! Wie mache ich denn das? Bisher mache ich das so (es klappt aber nicht):
Hauptskript:

Code: Alles auswählen

#...
opena = 1
# ...
def OnJa(self):
        opena = 0
Zweites Skript:

Code: Alles auswählen

#!/usr/bin/env python(w)
# -*- coding: iso-8859-1 -*-


import helloworld

while True:
    if helloworld.opena == 0:
        print helloworld.opena
        break
Leider funktioniert das nicht. Hat jemand eine andere Lösung des Problems für mich?

Gruß

DHK

Verfasst: Donnerstag 29. März 2007, 13:53
von name
So wird das nuex :)
Das liesse sich entweder ueber sockets mit dem loopback device, oder aber, ueber ein file loesen, wo einer reinschreibt und der andere liest.
Ich faende sockets schoener ;)

Code: Alles auswählen

"""
Client
"""

class mysocket:
		def __init__(self, sock=None):
			if sock is None:
				self.sock = socket.socket(
					socket.AF_INET, socket.SOCK_STREAM)
			else:
				self.sock = sock
		def connect(self,host, port):
			"""
			Connects to host
			"""
			self.sock.connect((host, port))
		def send(self,msg):
			"""
			Sends msg to the server
			"""
			sent = self.sock.send(msg+"\0")
		def receive(self):
			"""
			Returns content sent by server
			"""
			end = ''
			while 1:
				chuck= self.sock.recv(1)
				if(chuck != "\0"):
					end += chuck
				else:
					break
			return end

Code: Alles auswählen

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import time
import sys

"""
This module defines the server
"""
class Channel:
		"""
		This class defines one single player that's connected
		"""
		def __init__(self,channel,details):
			self.channel = channel
			self.details = details
			self.done = False
		def send(self,msg):
			"""
			Sends msg to the client
			"""
			sent = self.channel.send(msg+"\0")
		def handleReceive(self):
			"""
			Handles the received content
			"""


			receive = self.receive()
			if receive == "RESTART":
				self.done = True
				print "Restart"
				#Start the other python script
			if receive == "END":
				sys.exit(0)
				

		def receive(self):
			"""
			Returns content sent by client
			"""
			end = ''
			while 1:
				chunk= self.channel.recv(1)
				if(chunk != "\0"):
					end += chunk
				else:
					break
			if end != '':
				return end
		def mainLoop(self):
			while 1:
				self.handleReceive()
				if self.done:
					return True
				time.sleep(0.1)
class Main:
	def __init__(self,port):
			i = 0
			self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
			self.sock.bind(("", port))
			self.sock.listen( 1 )
			i = 0
			while 1:
				self.listen()
	def listen(self):
		channel, details = self.sock.accept()
		client = Channel(channel, details)
		client.mainLoop()


port = 92525
if __name__ == "__main__":
	main = Main(port)
>>> sock = mysocket()
>>> sock.connect("127.0.0.1", 92525)
>>> sock.send("RESTART")
>>> sock = mysocket()
>>> sock.connect("127.0.0.1", 92525)
>>> sock.send("RESTART")
Und der server sagt dann:
Restart
Restart
Das ganze ist aus einem pyGame Netzwerkspielchen von mir(etwas abgeaendert), deshalb die kommentare ;)

Hoffe ich konnte helfen