为什么 Tkinter 窗口冻结,从标题栏移动窗口时,它开始工作



我有一个窗口,我在其中通过单击一个按钮来查询 DB2 数据库表,它会将记录提取到我的窗口中。

对于几个表,单击"查询"按钮后,我可以在窗口中正确获取记录。

但是对于许多其他表,单击"查询"按钮后,我的窗口会冻结。现在,当我使用鼠标按钮通过其标题栏移动窗口时,窗口会很快解冻,并且我正确地从数据库表中获取所有记录。

我在Text小部件中显示每个记录字段。

早些时候,当我使用Label小部件代替Text小部件时,我没有遇到此问题。

这就是我在运行时创建Text小部件的方式。

fld_name = Text(self.response_frame, background='yellow', relief=GROOVE,
                        borderwidth=1, height=1)
val_text = str(ibm_db.field_name(result, i)) # I am getting the value from DB2 database here
fld_name.configure(width=len(val_text) + 5) # As the Text widget doesn't auto-resize, so I am configuring it's size.
fld_name.insert(1.0, val_text)
fld_name['state'] = 'disabled'
fld_name.grid(column=i, row=j, sticky=(W, E))

请指教。

谢谢。

您需要尊重在插入或删除之前和之后正确更改fld_name状态的顺序,从NORMALDISABLED (反之亦然)。

这意味着插入操作必须如下所示:

fld_name.configure(state='normal')
fld_name.insert(1.0, val_text)
fld_name.configure(state='disabled')

但这仍然可能导致您出现不希望的行为,因为 fld_name.configure(state='normal') 行假设您的fld_name处于相反的状态(禁用),正如我在上面的介绍段落中所述。这意味着您将需要对代码执行最后的修改,并且它涉及您创建fld_name的方式:

fld_name = Text(self.response_frame, state = 'disabled', background='yellow', relief=GROOVE,   borderwidth=1, height=1)

如您所见,您只需在创建时添加选项state = 'disabled',即可尊重上面第一段的陈述。

因此,我们以连贯的顺序更改fld_name状态:

DISABLED NORMAL DISABLED

请注意,如果您在上述行fld_name.configure(state='disabled')之后fld_name中插入或删除数据,则需要绝对恢复fld_name的状态以NORMAL。始终尊重本答案第一段的陈述。

最新更新