Tkinter无法使用pack_forget()插入Text Widgets

时间:2013-06-18 02:19:11

标签: python tkinter

我的应用程序可以接收多个使用线程处理的作业。我已经为每个作业创建了包含Text Widget的Tabs,但是我在将文本插入文本小部件时遇到了麻烦。

应用程序挂起时没有错误。

使用此处的脚本生成标签:http://code.activestate.com/recipes/577261-python-tkinter-tabs/

选项卡是Frames的子类,使用pack_forget()在未选中时隐藏它们。

我的应用程序的简化版本

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

我认为这是造成这个问题的原因......如果有的话还有其他选择吗?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

pack_forget对您是否可以插入文本小部件没有影响。您的问题中没有足够的信息可以给您答案。

如果您正在使用线程,是否可能尝试从线程中插入文本?您只能从主线程调用窗口小部件方法。虽然,通常结果是程序崩溃而不是挂起。

当tkinter应用程序挂起时,这有时是尝试在同一容器小部件中同时使用packgrid的症状。你在做吗?