Forum Moderators: Staff
Poser Python Scripting F.A.Q (Last Updated: 2024 Sep 18 2:50 am)
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
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
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?
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?
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.
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
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)
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.This site uses cookies to deliver the best experience. Our own cookies make user accounts and other features possible. Third-party cookies are used to display relevant ads and to analyze how Renderosity is used. By using our site, you acknowledge that you have read and understood our Terms of Service, including our Cookie Policy and our Privacy Policy.
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)
Activate the loop
root = Tk()
app = App(root, '')
app.Update()
root.mainloop()
End TK loop.