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 ? -- http://mail.python.org/mailman/listinfo/python-list