Bonjour voici le script en question:
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()
Dans la fonction def install_thread(self,event):
J'appelle le thread
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()])
et je lui passe les widget en argument, d'ailleurs si on print le widget en peut voir que l'on a bien des objet widget.
Et si je GetValue un widget dans ma thread sa marche. Par contre si je SetValue un widget dans la thread ca freeze mechament comme dans l'exemple ci dessus : /
Can someone help me ?
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.