我有Tkinter的小型GUI应用程序。非常简单的代码是获取选项列表并将其显示为用户的复选框并等待用户选择。为了执行我的任务,我将一个画布和一个框架放在其中,然后将滚动条也绑定到画布上。另外,由于我有未知数量的复选框,所以我将它们全部放在标签中,然后将标签放在我的框架上。一切正常,滚动条也是如此。但是有一个小问题,就是:当我打开窗户时,我在表格上有我的列表,但是当我滚动它们有“滞后”并且没有出现在我的表格上但是当我将鼠标悬停在该区域上时它们出现。 (就像古典窗户一样)。
码:
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"))
打开Page时
滚动时
来自@stovfl的评论我明白我有一些额外的额外标签。
我刚刚省略了populateCheckBox()函数中的标签,并将我的复选框直接放在画布上的框架上。
更改为:checkbox = tk.Checkbutton(self.frame,relief =“flat”)