Freeze with wxpython on python 2.3 or python 2.4 on Win32 with Thread

T

Tsubasa[Hokage]

Hello i have a problem with thread and wxpython on WIN32.

With this script :

I would like to SetValue to my gauge widget in a thread.
I can GetValue without a hitch but if I SetValue it freezing.

Try following script and go to AF-Tools Menu and click install

Normally in the install thread, I wrote "yo" in the console and I
SetValue of the gauge passed to the thread.

from wxPython.wx import *
from wxPython.wizard import *
from os import *
#import os
#import win32wnet, win32netcon
#import wmi
#import win32api
#import _winreg
import time
#import win32com,win32com.client
import sys
import shutil
import dircache
import struct, socket
from optparse import OptionParser

#import thread
import threading
#import Queue

__auteur__="FLFRSPA"


def map_drive(local, remote, username, password):
###self.map_drive("Z:",
"\\\L00438\c$",r"localhost\administrator","")###
return win32wnet.WNetAddConnection2(win32netcon.RESOURCETYPE_DISK,local,
remote, None,username, password,0)

class InstallThread(threading.Thread):
###La classe recoit
login,password,workstation,checkboxdomaine,domaine,self.log,self.g1,package
def __init__(self,login,password,workstation,checkboxdomaine,domaine,log,gauge,package):
threading.Thread.__init__(self)
self.result = None
self.i=0
self.login=login
self.password=password
self.workstation=workstation
self.package=package
self.checkboxdomaine=checkboxdomaine
self.domaine=domaine
self.log=log
self.gauge=gauge

def run(self):
self.result=1
print "yo"
self.gauge.SetValue(10)
self.result=1
return

class main_PyXrunAS(wx.Frame):
def __init__(self, *args, **kwds):
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
sizer = wxBoxSizer(wxVERTICAL)
self.SetSizer(sizer)
menuBar = wx.MenuBar()
# 1st menu from left
menu1 = wx.Menu()
#menu1.Append(101, "&Options", "Options de la LoFBOX")
menu1.Append(102, "&Quitter", "Quitter")
#self.Bind(wx.EVT_MENU, self.quit, id=102)
menu1.AppendSeparator()
menuBar.Append(menu1, "&Fichier")
# 2st menu from left
menu2 = wx.Menu()
menu2.Append(201, "&Test Connection", "Effectue un test de
connection sur la machine distante")
#self.Bind(wx.EVT_MENU, self.aide_dialog, id=201)
self.Bind(wx.EVT_MENU, self.query_freespace, id=201)
menu2.Append(202, "&Reboot Distant", "Effectue le reboot d'une
machine")
self.Bind(wx.EVT_MENU, self.query_reboot, id=202)
#self.Bind(wx.EVT_MENU, self.Apropos, id=202)
menu2.Append(202, "&Wake On Lan", "Effectue le démarrage
distant d'une machine")
menu2.Append(203, "&Install", "Install le package
selectionné")
self.Bind(wx.EVT_MENU, self.install_thread, id=203)
menu2.AppendSeparator()
menuBar.Append(menu2, "&AF-Tools")
self.SetMenuBar(menuBar)
###Logo Titre
self.remlogo = wx.StaticBitmap(self, -1,
wx.Bitmap("data/remote_logo.jpg", wx.BITMAP_TYPE_ANY),pos=(5,5))
sizer.AddWindow(self.remlogo, 0, wxALIGN_CENTRE|wxALL, 5)
sizer.AddWindow(wxStaticLine(self, -1), 0, wxEXPAND|wxALL, 5)
###Creation de la liste des packages
self.a=dircache.listdir('Package/')
self.a=self.a[:] # Copy the return value so we can change 'a'
t1=wx.Choice(self, -1, (60, 60), choices = self.a)
self.tc1 = t1
self.Bind(wx.EVT_CHOICE, self.Evtpackage, t1)
t1.Bind(wx.EVT_TEXT, self.Evtpackage)
l1 = wx.StaticText(self, -1, "Package: ",pos=(5,60))
l1.SetBackgroundColour("white")
###Jauge d'evolution
self.g1 = wx.Gauge(self, -1, 50, (220, 210), (190, 25))
self.g1.SetBezelFace(3)
self.g1.SetShadowWidth(3)
self.g1.SetBackgroundColour("White")
###Label progression
label_pro = wx.StaticText(self, -1, "Progression:
",pos=(220,190))
label_pro.SetBackgroundColour("white")
###Multiline log
label_log = wx.StaticText(self, -1, "Log: ",pos=(220,60))
label_log.SetBackgroundColour("white")
self.log = wx.TextCtrl(self, -1, "", size=(250,
100),pos=(220,80),
style = wx.TE_MULTILINE
#| wx.TE_RICH
| wx.TE_RICH2
)
###Setmachine
self.workstation = wx.TextCtrl(self, -1, "", size=(105,
-1),pos=(60,100))
label_workstation = wx.StaticText(self, -1, "Poste:
",pos=(6,100))
label_workstation.SetBackgroundColour("white")
#self.workstation.SetInsertionPoint(0)
self.workstation.Bind(wx.EVT_TEXT, self.EvtChar)
###Bouton pour tester la connection
#self.workstation_connect = wx.Button(self, -1, "Test
Connection", (210,55))
#self.workstation_connect.Disable()
#self.label_freespace = wx.StaticText(self, -1,
"",pos=(270,102))
#self.label_freespace.SetBackgroundColour("white")
#self.Bind(wx.EVT_BUTTON, self.query_freespace,
self.workstation_connect)

#self.Bind(wx.EVT_BUTTON, self.OnButton, b)
###Login/Password/Domain
self.t2 = wx.TextCtrl(self, -1, "", size=(105,
-1),pos=(60,140))
l2 = wx.StaticText(self, -1, "Login: ",pos=(6,142))
l2.SetBackgroundColour("white")
self.t3 = wx.TextCtrl(self, -1, "", size=(105,
-1),pos=(60,180),style=wx.TE_PASSWORD)
l3 = wx.StaticText(self, -1, "Password: ",pos=(6,182))
l3.SetBackgroundColour("white")
self.t5 = wx.TextCtrl(self, -1, "", size=(105,
-1),pos=(60,230))
l4 = wx.StaticText(self, -1, "Domaine: ",pos=(6,230))
self.t5.Disable()
l4.SetBackgroundColour("white")
self.cb1 = wx.CheckBox(self, -1, "Domaine", (60, 210), (90,
20), wx.NO_BORDER)
self.cb1.SetBackgroundColour("white")
self.Bind(wx.EVT_CHECKBOX, self.EvtCheckBox, self.cb1)
self.__set_properties()
self.__do_layout()

def EvtChar(self, event):
pass
return

def Evtpackage(self, event):
pass
return
#print self.workstation.GetValue()
#event.Skip()

def EvtListBox(self, event):
print 'EvtListBox: %s\n' % event.GetString()

def EvtCheckListBox(self, event):
index = event.GetSelection()
label = self.lb.GetString(index)
#status = 'un'
if self.lb.IsChecked(index):
self.list_option.append(label)
else:
self.list_option.remove(label)
print self.list_option
self.lb.SetSelection(index) # so that (un)checking also
selects (moves the highlight)
return


def __set_properties(self):
# begin wxGlade: MyFrame1.__set_properties
#user=win32api.GetUserName()
#self.t4.WriteText('%s' % user)
#self.t4.Disable()
self.SetTitle("AF-Remote-MSI "+__version__)
self.SetBackgroundColour("white")
self.SetSize((490, 350))
# end wxGlade

def __do_layout(self):
# begin wxGlade: MyFrame1.__do_layout
sizer_3 = wx.BoxSizer(wx.VERTICAL)
self.SetAutoLayout(True)
self.SetSizer(sizer_3)
self.Layout()
# end wxGlade

def query_freespace(self,event):
machine=self.workstation.GetValue()
pi=0
try:
c = wmi.WMI (machine)
pi=1
except:
self.log.WriteText(str(sys.exc_info()[1])+" \n")
pi=0
#self.label_freespace.SetLabel("Connection OK: ")
if (pi!=0):
for disk in c.Win32_LogicalDisk (DriveType=3):
self.log.WriteText(self.log.GetValue()+str(disk.Caption)+str(int(disk.FreeSpace)/1000000)+
"Mo Libres\n")
return

def query_reboot(self,event):
pi=0
try:
machine=self.workstation.GetValue()
c = wmi.WMI (computer=str(machine),
privileges=["RemoteShutdown"])
pi=1
except:
self.log.WriteText(str(sys.exc_info()[1])+" \n")
pi=0
if (pi!=0):
os = c.Win32_OperatingSystem (Primary=1)[0]
os.Reboot ()
self.log.WriteText("Reboot [OK]")
return

def SendWol(self,event):
if (str(self.mac.GetValue())!="aa-bb-cc-dd-ee \n"):
self.WakeOnLan(self.mac.GetValue())
else:
self.log.WriteText("Erreur adresse mac")
return

def WakeOnLan(self,ethernet_address):
pass

def EvtCheckBox(self, event):
#print 'EvtCheckBox: %d\n' % event.IsChecked()
if (event.IsChecked()==1):
self.t5.Enable()
if (event.IsChecked()==0):
self.t5.Disable()

def OnButton(self, event):

dlg = wx.DirDialog(self, "Choose a directory:",

style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON)
if dlg.ShowModal() == wx.ID_OK:
# This returns a Python list of files that were selected.
paths = dlg.GetPath()
for path in paths:
self.tc1.WriteText('%s' % path)
dlg.Destroy()
return

def Ecrire_batch(self):
#contenu="cscript //H:CScript //S \n"
contenu="xrunas.vbs /profile /user:administrator /pwd:?????
"+str(self.tc1.GetValue())
#contenu=contenu+" -pw="+input+" -language=F -client=100
-sysname=\"FP1 - Production\""
batch="AFpyxras.bat"
file = open(batch, "w")
file.write(contenu)
file.close()
return

def install_thread(self,event):
subThread2 =
InstallThread(self.t2.GetValue(),self.t3.GetValue(),self.workstation.GetValue(),self.t5.GetValue(),self.cb1,self.log,self.g1,self.a[self.tc1.GetSelection()])
subThread2.start()
subThread2.join()

#result = subThread2.result
#print result

def install_vnc(self,name,time):
pass
return

class GUIThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)

def run(self):
class PyXrunAS(wx.App):
def OnInit(self):
wx.InitAllImageHandlers()
frame_2 = main_PyXrunAS(None, -1, "")
self.SetTopWindow(frame_2)
frame_2.Show()
return 1

self.app = PyXrunAS(0)
self.app.MainLoop()

if __name__ == "__main__":
subThread = GUIThread()
subThread.start()
subThread.join()
#subThread.Run()

Can someone help me ?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,577
Members
45,054
Latest member
LucyCarper

Latest Threads

Top