0

我的应用程序可以接收它使用线程处理的多个作业。我为每个作业创建了包含文本小部件的选项卡,但在将文本插入文本小部件时遇到了问题。

应用程序只是挂起没有错误。

使用此处找到的脚本生成选项卡:http: //code.activestate.com/recipes/577261-python-tkinter-tabs/

选项卡是 Frames 的子类,当它们未被选中时使用 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()

主文件

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 回答