0

私のアプリケーションは、スレッドを使用して処理する複数のジョブを受け取ることができます。各ジョブのテキスト ウィジェットを含むタブを作成しましたが、テキスト ウィジェットにテキストを挿入するのに問題があります。

アプリケーションがハングするだけのエラーはありません。

タブは、次のスクリプトを使用して生成されます: http://code.activestate.com/recipes/577261-python-tkinter-tabs/

タブは、pack_forget() を使用して選択されていないときに非表示にするフレームのサブクラスです。

私のアプリの簡易版

サーバー.py

class supply_thread(threading.Thread):

    def __init__(self, _sock, app):
        threading.Thread.__init__(self)
        self.app = app


    def run(self):

        def close_tab():
            print 'Terminating supply.'
            new_supply.kill()


        # Create new tab
        self.tab = Frame(self.app)
        self.tab.pack()
        #self.tab.pack_forget() # <-- inserting this causes the app to hang

        # Scrollbar
        self.scrollbar = Scrollbar(self.tab)
        self.scrollbar.pack(side=RIGHT, fill=Y)

        # Text
        self.text = Text(self.tab, yscrollcommand=self.scrollbar.set)
        self.scrollbar.config(command=self.text.yview)

        self.text.pack(expand=YES, fill=BOTH)

        # Close
        self.button = Button(self.tab, text="CLOSE", command=close_tab)
        self.button.pack(side=BOTTOM, fill=BOTH, expand=YES)



        print 'Starting thread' , data[0]['job'] , data[0]['supply']['dir_name'] , self.getName()
        logging.info(data[0])
        new_supply = supply.supply(data, self.app, self.text)
        new_supply.run()
        print 'Closing Thread' , data[0]['job'] , data[0]['supply']['dir_name'] , self.getName()

main.py

class App(Tk):

    def __init__(self, master=None):
        Tk.__init__(self, master)

        tab1 = Frame(self)
        tab1.pack()

        self.scrollbar = Scrollbar(tab1)
        self.scrollbar.pack(side=RIGHT, fill=Y)

        self.text1 = Text(tab1, yscrollcommand=self.scrollbar.set)
        self.scrollbar.config(command=self.text1.yview)
        self.text1.pack(expand=YES, fill=BOTH)


if __name__ == "__main__":
    app = App()

    server = server(app)
    server.daemon = True
    server.start()

    app.mainloop()

これが問題の原因だと思います...もしそうなら、代替手段はありますか?

よろしくお願いします。

4

1 に答える 1

1

pack_forgetテキストウィジェットに挿入できるかどうかには影響しません。あなたの質問には、答えを出すのに十分な情報がありません。

スレッドを使用している場合、スレッド内からテキストを挿入しようとしている可能性はありますか? ウィジェット メソッドは、メイン スレッドからのみ呼び出すことができます。ただし、通常、この結果は、プログラムがハングするのではなくクラッシュすることです。

tkinter アプリがハングする場合、同じコンテナー ウィジェットで と のpack両方を使用しようとした場合に発生することがあります。gridあなたはそれをやっていますか?

于 2013-06-18T10:46:15.957 に答える