2017-05-10 1 views
2

J'ai quelques problèmes en utilisant la classe SaveFileDialog de .Net dans Python 3.4 avec le paquet pythonnet. Ci-dessus, vous verrez un petit échantillon de code pour illustrer ce problème. Le code lui-même fonctionne très bien jusqu'à ce que l'événement du clic sur le bouton se déclenche et que SaveFileDialog soit affiché avec "dialog.ShowDialog()" l'application se bloque et rien ne se passe du tout. Testé le même code avec l'interpréteur IronPython et cela a bien fonctionné. Je l'ai déjà cherché sur le web pour quelques réponses, mais rien trouvé lié à cette questionImpossible d'utiliser SaveFileDialog de .Net avec pythonnet

import clr 
clr.AddReference("System.Windows.Forms") 
clr.AddReference("System.Drawing") 
from System.Windows.Forms import Form, Application, Button, SaveFileDialog 
from System.Drawing import Point 

class TestForm(Form): 
    def __init__(self): 
     self.button = Button() 
     self.addButton() 

    def addButton(self): 
     self.button.Location = Point(50,50) 
     self.button.Text = "Save s.th" 
     self.Controls.Add(self.button) 
     self.button.Click += self.buttonClick 

    def buttonClick(self, sender, event): 
     dialog = SaveFileDialog() 
     dialog.FileName = "test one" 
     dialog.Title = "Test One" 
     print("so far so good") 
     dialog.ShowDialog() 
     print("Never reaches this point") 
Application.Run(TestForm()) 
+1

Ok, j'ai fait une sorte de progrès avec mon problème. J'ai essayé de déjeuner le même code que j'ai posté ci-dessus avec spyder qui vient avec "WinPython" (voir ). Mais si j'essaie de le compiler avec "pyinstaller", l'erreur réapparaît. Alors pourquoi ne fonctionne-t-il qu'avec spyder? –

+0

voir ma réponse ci-dessous - j'ai testé et ça marche super! – denfromufa

Répondre

1

Vous devez définir l'état appartement thread STA comme décrit dans ce numéro:

https://github.com/pythonnet/pythonnet/pull/197

import clr 
clr.AddReference("System.Windows.Forms") 
clr.AddReference("System.Drawing") 
from System.Windows.Forms import Form, Application, Button, SaveFileDialog 
from System.Drawing import Point 
from System.Threading import Thread, ThreadStart, ApartmentState 

class TestForm(Form): 
    def __init__(self): 
     self.button = Button() 
     self.addButton() 

    def addButton(self): 
     self.button.Location = Point(50,50) 
     self.button.Text = "Save s.th" 
     self.Controls.Add(self.button) 
     self.button.Click += self.buttonClick 

    def buttonClick(self, sender, event): 
     dialog = SaveFileDialog() 
     dialog.FileName = "test one" 
     dialog.Title = "Test One" 
     print("so far so good") 
     dialog.ShowDialog() 
     print("Never reaches this point") 


def app_thread(): 
    app = TestForm() 
    Application.Run(app) 


def main(): 
    print('start thread') 
    thread = Thread(ThreadStart(app_thread)) 
    print('set thread apartment STA') 
    thread.SetApartmentState(ApartmentState.STA) 
    thread.Start() 
    thread.Join() 


if __name__ == '__main__': 
    main() 

Et la sortie est ici:

start thread 
set thread apartment STA 
so far so good 
Never reaches this point 
+1

Merci, ça marche bien pour moi :) Je peux aussi construire un fichier .exe avec pyinstaller. Cela vous dérange-t-il de m'expliquer brièvement pourquoi je l'ai fait de cette façon? –

+1

Pour l'exigence STA jeter un oeil à la réponse à cette question: http://stackoverflow.com/questions/4659220/why-are-winforms-applications-stathread-by-default – denfromufa

+1

Encore une fois merci pour votre réponse. Cela m'aidera. –