3

Tkinter GUI を使用する分散チャットを実装しました。システムを Fedora18 に更新すると、Tkinter イベントを呼び出すときに例外が発生します。ここで説明したのとほぼ同じです。

Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib64/python2.7/threading.py", line 551, in bootstrap_inner self.run()
File "/usr/lib64/python2.7/threading.py", line 504, in run self.target(*self.__args, **self.__kwargs)
File "/hachat/peer.py", line 156, in startRecvLoop
self.processMessage(msg, addr)
File "/hachat/peer.py", line 222, in processMessage
self.gui.receive(msg) 
File "/hachat/gui.py", line 74, in receive
self.textfenster.insert(END,msg.name+": "+msg.text+'\n')
File "/usr/lib64/python2.7/lib-tk/Tkinter.py", line 2986, in insert
self.tk.call((self._w, 'insert', index, chars) + args)
TclError: out of stack space (infinite loop?)

これは gui クラスから抜粋したものです。

import Tkinter
import ScrolledText
import tkMessageBox
import tkSimpleDialog
import threading 

class gui(object):

    def __init__(self, parent):
        self.root = Tkinter.Tk()             
        self.textfenster = ScrolledText.ScrolledText(self.fpopup,width=90,height=24,background='white')
        self.textfenster.pack(fill=Tkinter.BOTH, expand=Tkinter.YES)

    def run(self):
        self.guiRunThread = threading.Thread(target=self.root.mainloop())
        self.guiRunThread.daemon = True
        self.guiRunThread.start()

    def receive(self,msg):
        self.textfenster.insert(Tkinter.END,msg.name+": "+msg.text+'\n')
        self.textfenster.see(Tkinter.END)

例外は私のシステムでのみ表示されます。その理由は、tk がスレッドをサポートするようにコンパイルされていないためと思われます。この Exeption を取り除かなければなりません。プログラムは配布されているため、別のシステムで実行する必要があります。したがって、この例外を取り除く方法と、スレッドをサポートするための tk を取得するためのヒントを求めています。Python のバージョンは 2.7.3、Tcl/Tk バージョンは 8.5 です。import Tkinter; Tkinter.Tk().tk.eval("puts $tcl_platform(threaded)")同様に例外を返しています。

4

2 に答える 2

1

Tkと通信するキューの問題を解決しました。例については、 Tkinter を使用したマルチスレッド python を参照してください。

于 2013-01-27T15:59:37.157 に答える