2017-05-10 11 views
2

pythonnetパッケージでPython 3.4で.NetのSaveFileDialogクラスを使用していくつかの問題があります。上に、その問題を示すコードのサンプルが表示されます。ボタンクリックのイベントが発生し、SaveFileDialogが "dialog.ShowDialog()"で表示され、アプリケーションがフリーズして何も起こらなくなるまで、コード自体はかなりうまく動作します。 IronPythonインタプリタで同じコードをテストしたところ、正常に動作しました。私はすでにいくつかの答えのためのWebを検索するが、あなたがこの問題で説明するようにSTAスレッドのアパートメント状態を設定する必要があるという問題Pythonnetで.NetのSaveFileDialogを使用することはできません

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]をクリックして問題を解決しました。私は上記の "WinPython"(参照)に付属のスパイダーと同じコードをランチしようとしました。しかし、 "pyinstaller"でコンパイルしようとすると、エラーが再び表示されます。それでなぜスパイダーでしか動かないのですか? –

+0

下記の私の答えを参照してください - 私はテストし、それは素晴らしい動作します! – denfromufa

答えて

1

に関連するものは認められません:

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() 

そして、出力は次のとおりです。

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

ありがとう、それは私のためにうまく動作します:)私は同様pyinstallerで.exeを構築することができます。どうしてそんなことをしたのか、私に簡単な説明をしてもらえますか? –

+1

STA要件については、この質問の回答をご覧ください:http://stackoverflow.com/questions/4659220/why-are-winforms-applications-stathread-by-default – denfromufa

+1

もう一度あなたの答えに感謝します。これは私を助けるだろう。 –

関連する問題