我的应用程序可以接收多个使用线程处理的作业。我已经为每个作业创建了包含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()
我认为这是造成这个问题的原因......如果有的话还有其他选择吗?
提前感谢您的帮助。
答案 0 :(得分:1)
pack_forget
对您是否可以插入文本小部件没有影响。您的问题中没有足够的信息可以给您答案。
如果您正在使用线程,是否可能尝试从线程中插入文本?您只能从主线程调用窗口小部件方法。虽然,通常结果是程序崩溃而不是挂起。
当tkinter应用程序挂起时,这有时是尝试在同一容器小部件中同时使用pack
和grid
的症状。你在做吗?