3

課題に比較的単純な GUI ライブラリを使用する学生のために、GUI を別のスレッドにオフロードする必要があります (スレッド セーフのためにキューを使用してそれらの間でデータを転送します)。ただし、私が使用するコードは Windows と Linux では問題なく動作しますが、Mac OS X では空白のハング スクリーンが表示されます (処理は実際には続行されますが、生成されたウィンドウを閉じる唯一の方法は強制終了することです)。

ライブラリの問題を数行のコードに絞り込みました。

import Tkinter
import threading

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

  def run(self):
    self.mainroot = Tkinter.Tk()
    self.mainroot.mainloop()

MyFactory().start()

init() が start() を呼び出すようにコードを調整しても、効果はありませんでした。

import Tkinter
import threading

class MyFactory(threading.Thread):
  def __init__(self):
    threading.Thread.__init__(self)
    self.start()

  def run(self):
    self.mainroot = Tkinter.Tk()
    self.mainroot.mainloop()

MyFactory()

ウィンドウの作成位置を変更すると (Tk() を呼び出す)、スレッド化エラーが発生するだけです (当然のことです)。

使用環境は Mac OS 10.6.8 と 10.8 で、それぞれ Python 2.6.3 と 2.7.3 を使用しています。制限は、Python 3.0 以降を使用しないことです (ただし、それが唯一の修正方法である場合は、いくつかの作業が必要になります)。

ただし、追加のスレッドを使用しない単純なテスト プログラムは機能します。

問題は、Mac OS でこれを修正する方法です。

4

1 に答える 1

0

おそらく、これを修正する唯一の方法は、メイン スレッドで tkinter コードを実行することです。Tkinter は、スレッドで動作するように設計されていません。

于 2013-09-27T10:54:31.370 に答える