python - 线程不解冻 Tkinter
问题描述
环境
我正在使用 Python 的Tkinter编写一个程序,它为用户提供了一个装满农产品的仓库的可视化表示。
仓库由成堆的盒子组成,呈网格状排列。为了避免与数据结构混淆,我将堆栈称为一个点,就像在仓库地板上的一个点一样。
我已经安排了我的 GUI,以便显示点的网格,并且当用户单击每个点时,会显示其中的框的表示。
问题
当单击网格上的某个点时,GUI 往往会冻结 - 大约二十分之一。据我所知,导致冻结的代码行是何时.grid()
被调用的。
Havint 在这个网站上查看了一些类似的问题,我尝试过使用 threading,但这没有帮助。
编码
这是完整代码中的高级类之一,它运行到几百行。
如果有帮助,我很乐意发布更多代码。
class CS_Viewer:
def __init__(self, parent):
self.parent = parent
self.parent_window = self.parent.get_top()
self.code = self.parent.coldstore.code
self.parent.coldstore.reconstruct()
self.max_max_layers = self.parent.coldstore.get_max_max_layers()
self.layer = 0
self.top = Frame(self.parent_window)
self.top_title = Label(self.top, text="CSEye",
font=(main_font, title_pt, "bold"))
self.subtitle = Label(self.top, text="code="+self.code,
font=(main_font, subtitle_pt, "bold"))
self.main_container = Frame(self.top)
self.spot_grid = Spot_Grid(self, self.main_container)
self.box_details = Text(self.main_container,
height=details_height, width=details_width,
state=DISABLED)
self.spot_stack = Spot_Stack(self.main_container, None,
self.box_details)
self.add_headings()
self.arrange()
# Add headings to the holster widgets.
def add_headings(self):
spot_grid_label = Label(self.main_container, text="Coldstore",
font=(main_font, big_pt, "bold"))
spot_stack_label = Label(self.main_container, text="Spot",
font=(main_font, big_pt, "bold"),
width=spot_stack_width)
box_details_label = Label(self.main_container, text="Box",
font=(main_font, big_pt, "bold"))
spot_grid_label.grid(column=0, row=0)
spot_stack_label.grid(column=1, row=0)
box_details_label.grid(column=2, row=0)
# Ronseal.
def place_spot_stack(self):
self.spot_stack.get_top().grid(column=1, row=1,
padx=standard_pad, pady=standard_pad)
# ^^^ The problem seems to be here. ^^^
# Arrange the object's elements.
def arrange(self):
self.top_title.pack()
self.subtitle.pack()
self.spot_grid.get_top().grid(column=0, row=1, sticky=N,
padx=standard_pad, pady=standard_pad,
ipadx=inner_pad, ipady=inner_pad)
self.place_spot_stack()
self.box_details.grid(column=2, row=1, sticky=N,
padx=standard_pad, pady=standard_pad)
self.main_container.pack()
# Replace the spot stack widget.
def replace_spot_stack(self):
self.spot_stack.get_top().grid_forget()
Thread(target=self.place_spot_stack).start()
# Ronseal.
def get_top(self):
return self.top
解决方案
推荐阅读
- rest - 无法调用 TFS 2017 REST API
- android - 在 Retrofit 和 @Body 注解中使用 PATCH 方法
- javascript - 如何将 javascript 变量传递到 java servlet doPost
- android - 麦克风从手机扬声器拾取声音产生反馈
- mysql - apache Drill - 它是否支持具有相同存储插件的 mysql 内部连接
- python - 将 pyModbus 数据检索到列表中
- r - R闪亮错误:在eventReactive和Desctools中使用时找不到对象'输入'
- excel - 隐藏工作表上的所有对象
- typescript - 为什么 ngSubmit 绑定到表单中的所有按钮
- google-api - 在 Google Analytics API for Postman 中获取令牌