Tkinter 表单在滚动时显示数据滞后
Tkinter form lags in showing data while scrolling
我有一个带有 Tkinter 的小型 GUI 应用程序。非常简单的代码是获取选项列表并将它们显示为用户的复选框并等待用户选择。
为了执行我的任务,我在里面放了一个 canvas 和一个框架,然后也绑定了滚动条 canvas,而且因为我首先有未知数量的复选框,所以我把它们全部放在一个标签中,然后把标签贴在我的相框上。
一切正常,滚动条也是如此。
但有一个小问题,即:当我打开 windows 时,我在表格上有我的列表,但是当我滚动时,它们有“Lag”并且没有出现在我的表格,但当我将鼠标悬停在该区域上时 出现 。(就像经典的 windows 冻结)。
代码:
class StartPage(tk.Frame):
testListOut = []
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.testList = []
self.canvas = tk.Canvas(self, borderwidth=2, relief="sunken")
self.frame = tk.Frame(self.canvas)
self.scrollbar = tk.Scrollbar(self.canvas, orient="vertical", command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.scrollbar.set)
self.scrollbar.pack(side="right", fill="y")
self.canvas.pack(side="top", fill="both" ,expand="true")
self.canvas.create_window((4, 4), window=self.frame, anchor="nw",tags="self.frame")
self.frame.bind("<Configure>", self.onFrameConfigure)
self.populateCheckBox(lNames)
def populateCheckBox(self ,testList):
self.checks = []
self.vars = []
label = tk.Label(self.frame , width=3, borderwidth="1")
label.pack()
for element in testList:
var = tk.BooleanVar()
var.set(False)
checkbox = tk.Checkbutton(label, relief="flat")
checkbox["text"] = element
checkbox["command"] = lambda: self.handler(testList)
checkbox["variable"] = var
checkbox.grid(sticky="w", padx="10", pady="5")
self.checks.append(checkbox)
self.vars.append(var)
def onFrameConfigure(self, event):
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
打开页面时
滚动时
从@stovfl 的评论中我了解到我有一些次要的额外标签。
我只是省略了 populateCheckBox() 函数中的标签,并将我的复选框直接放在 canvas 的框架上。
更改为:checkbox = tk.Checkbutton(self.frame, relief="flat")
我有一个带有 Tkinter 的小型 GUI 应用程序。非常简单的代码是获取选项列表并将它们显示为用户的复选框并等待用户选择。 为了执行我的任务,我在里面放了一个 canvas 和一个框架,然后也绑定了滚动条 canvas,而且因为我首先有未知数量的复选框,所以我把它们全部放在一个标签中,然后把标签贴在我的相框上。 一切正常,滚动条也是如此。 但有一个小问题,即:当我打开 windows 时,我在表格上有我的列表,但是当我滚动时,它们有“Lag”并且没有出现在我的表格,但当我将鼠标悬停在该区域上时 出现 。(就像经典的 windows 冻结)。
代码:
class StartPage(tk.Frame):
testListOut = []
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.testList = []
self.canvas = tk.Canvas(self, borderwidth=2, relief="sunken")
self.frame = tk.Frame(self.canvas)
self.scrollbar = tk.Scrollbar(self.canvas, orient="vertical", command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.scrollbar.set)
self.scrollbar.pack(side="right", fill="y")
self.canvas.pack(side="top", fill="both" ,expand="true")
self.canvas.create_window((4, 4), window=self.frame, anchor="nw",tags="self.frame")
self.frame.bind("<Configure>", self.onFrameConfigure)
self.populateCheckBox(lNames)
def populateCheckBox(self ,testList):
self.checks = []
self.vars = []
label = tk.Label(self.frame , width=3, borderwidth="1")
label.pack()
for element in testList:
var = tk.BooleanVar()
var.set(False)
checkbox = tk.Checkbutton(label, relief="flat")
checkbox["text"] = element
checkbox["command"] = lambda: self.handler(testList)
checkbox["variable"] = var
checkbox.grid(sticky="w", padx="10", pady="5")
self.checks.append(checkbox)
self.vars.append(var)
def onFrameConfigure(self, event):
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
打开页面时
滚动时
从@stovfl 的评论中我了解到我有一些次要的额外标签。
我只是省略了 populateCheckBox() 函数中的标签,并将我的复选框直接放在 canvas 的框架上。
更改为:checkbox = tk.Checkbutton(self.frame, relief="flat")