tromnek opened this issue on Dec 04, 2004 ยท 10 posts
tromnek posted Sat, 04 December 2004 at 7:29 PM
When I have two scripts running each with a GUI (tkinter).
If I close one, the other crashes. I've been using (somewhat blindly) the application setup I generally see in Okham's stuff see big snippet below.
Is there something special I should do to fix this?
tia,
ken
...snip...
class App:
def init(self, master, textMessage):
self.master = master
master.title("TromNek's Library Executor")
self.buttonGo = Button(self.master, text="Load", command=self.handleGo)
self.buttonGo.grid(row=1, column=3)
...snip...
self.master.protocol('WM_DELETE_WINDOW', self.handleCancel)
def check_conn(self):
conn, (remotehost, remoteport) = sock.accept()
...snip...
def handleCancel(self):
self.master.destroy()
def Update(self):
try:
self.check_conn()
except:
pass
if scene: scene.ProcessSomeEvents(1)
root.lift()
root.after(100, self.Update)
root = Tk()
app = App(root, '')
app.Update()
root.mainloop()
duckmango posted Mon, 06 December 2004 at 12:17 PM
It's just speculation, but perhaps Poser's Python interpreter is passing the WM_Delete_Window Message to both scripts, causing one to crash unexpectedly. There was a recent thread here (http://www.renderosity.com/messages.ez?ForumID=12390&Form.ShowMessage=1986945) about the lack of thread support in PoserPython, so perhaps that's related.
In regards to a workaround, can you combine the gui's into one script, perhaps using the Toplevel widget to house your second script? Toplevel works just like Frame, but creates a separate "toplevel" window where you can load other widgets into it, etc.
Then, after setting up your separate gui's, you can use just one repeater function to do your housekeeping, heavy lifting, etc. Just a thought...Good luck.
Message edited on: 12/06/2004 12:18
PoseWorks posted Mon, 06 December 2004 at 6:32 PM
When you have two Tk apps, you should use Toplevel for the newest window.
I like to build my window classes with an argument to take a root window. That way I can feed them an appropriate root window:
from Tkinter import *
class NewWin:
-----def init(self, root_win=None):
----------if root_win:
---------------self.root = root_win
----------else:
---------------self.root = Tk()
---------------self.root.protocol('WM_DELETE_WINDOW',self.destroy)
-----def mainloop(self):
----------self.root.mainloop()
-----def destroy(self):
----------self.root.destroy()if name == 'main':
-----test_win = NewWin()-----test_win.top = Toplevel()
-----test_win.son_of_test_win = NewWin(test_win.top)-----test_win.mainloop()
#PoserPython hates it when you end on a tabbed line
You end up with a few more lines of code, but it may be worth it in a multi-window environment. (Remember, any extra windows should ultimately be slaved under the master window [master.slave], that way you can be absolutely sure that everything gets destroyed once the master window is destroyed.)
Message edited on: 12/06/2004 18:34
tromnek posted Mon, 06 December 2004 at 8:21 PM
thanks all. My main problem is running other persons scripts with mine. Is there a way to get a brand new instance of Tk() so that independent scripts done destroy each other?
tromnek posted Mon, 06 December 2004 at 9:59 PM
My specific problem right now is that I want to run a background process to listen for an incomming socket connection. Threads seems to be broken so I can't
kickit=threading.timer( 1.0, check_for_connection).
I had my script running under tkinter, but had problems when I ran somebody else's script with tkinter, while my script was running.
Any Ideas?
PoseWorks posted Tue, 07 December 2004 at 12:17 AM
You could try setting a callback with after_idle([,args]) that would set WM_DELETE_WINDOW to a function of your choosing (one that didn't delete windows at all) after the alien script had gone to the mainloop. An example would be: ------------------- > def nullify(): > -----pass > def reset_x(master): #may need an event arg too, not sure > -----master.protocol('WM_DELETE_WINDOW',nullify) > master.after_idle(reset_x, master) > exec("script.py") ------------------- This has the unhappy side-effect of making the user unable to destroy windows through the system's close button though. If you know that the script that you want to execute is safe, you could do something like this: ------------------- file = open("script.py",'r') file_data = file.read() file.close() import re new_data = re.compile("""Tk()""").sub("Toplevel()",file_data) file = open("temp_script.py",'w') file.write(new_data) file.close() exec("temp_script.py") ------------------- But it's somewhat dangerous to monkey with someone else's code. What's the reason for trying to execute someone else's script, and would be consistently be the same script?
tromnek posted Tue, 07 December 2004 at 7:23 AM
hmmm.
I have a script that listens on a network socket for a connection from an external application. The external application sends filepath names to the script. If the filepath is a poser library file or a python script, it loads (library file) or executes (python script) it.
Since this script will be running all the time, I want to be able to load any other script while it's running (either sent over the network socket, or manually run in poser by the user).
I don't really need tkinter for my 'listening' script. I'd rather had used 'threading' (but it seems broken in poser).
I don't want to use the poser 'SetEventCallBack()' because it calls back excessively and it doesn't call back until I get back to poser from an external application.
mkrueger posted Tue, 07 December 2004 at 8:34 PM
Hi tromnek, the thread duckmango mentioned above was mine, I had the problem that the threading module wasn't even there in Poser, so I installed Python 2.2 and exchanged Poser's python22.dll with the standard Python one. This takes care of the availability of threading. I still have some issues with threads, but I suspect this is caused by the Tkinter mainloop. So if you don't need a GUI, you should be fine. BTW, does anyone know how to query if a Tkinter app has the focus or not? Martin
tromnek posted Tue, 07 December 2004 at 9:29 PM
I tried running my 2.2.3 version when I was trying to get the pythoncom to work. It seemed buggy. I even tried putting the whole 2.2.3 lib tree, but it still wasn't working good (maybe i'll try again). Anyway, I want normal pp and p5 poser users to be able to use my script. Seno Software (P3dO Explorer) want's to hook into it so their users can send poses (and other stuff) directly to poser. For that matter, any program could send poser file names directly to my script thru a standard tcp/ip socket. We could even have Poser and Shade7 talk to each other directly using a defined protocol. Thanks (maybe Poser 6 will have threads)
tromnek posted Fri, 21 January 2005 at 3:49 PM
Attached Link: http://www.renderosity.com/messages.ez?ForumID=12390&Form.ShowMessage=2087664
I found some neat stuff about this so, I posted a new thread on this topic.