我正在尝试创建一个既有滚动部分又有非滚动部分的用户界面。在滚动部分将是标签和用户条目的列表,在不可滚动部分中将是有关如何填写条目的信息。我正在考虑使用一个单独的窗口来显示信息,但想知道是否可以在同一个窗口中显示它们。
我已经调整了对此问题的响应中的代码:Adding a scrollbar to a group of widgets in Tkinter但是当我尝试将消息区域和滚动区域添加到单独的框架中时,Python shell崩溃并且无法打开。这是我正在使用的代码。
import Tkinter as tk
labelList = []
for i in range(100):
labelList.append(["This is label %s " %(i),"99"])
class Example(tk.Frame):
#Creation of scrollable canvas
def __init__(self, root, labelList):
tk.Frame.__init__(self, root)
#Creating Scrollable and Non-scrollable frames
self.scrollFrame = tk.Frame(root,bg = "red")
self.scrollFrame.grid(row = 0, column = 0, rowspan = 3, columnspan = 2)
self.no_scrollFrame = tk.Frame(root,bg = "blue")
self.no_scrollFrame.grid(row = 0, column = 2, rowspan = 3, columnspan = 2)
#Canvas assigned to Scrollable Frame
self.canvas = tk.Canvas(self.scrollFrame, borderwidth=0, background="#ffffff")
self.frame = tk.Frame(self.canvas, background="#ffffff")
self.vsb = tk.Scrollbar(self.scrollFrame, orient="vertical", command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set)
self.vsb.pack(side="right", fill="y")
self.canvas.pack(side="left", fill="both", expand=True)
self.canvas.create_window((4,4), window=self.frame, anchor="nw",
tags="self.frame")
#Message assigned to non-Scrollable Frame
messageText = """
Information \n
Information \n
Information \n
Information \n
Information \n
Information \n
Information \n
Information \n
"""
self.Message1 = tk.Message(self.no_scrollFrame, text=messageText)
self.Message1.grid(row = 1, rowspan = len(labelList)+1, column = 2)
self.frame.bind("<Configure>", self.onFrameConfigure)
self.entry ={}
self.label = {}
self.populate()
def populate(self):
i=0
if len(labelList) != 0:
for item in labelList:
e = tk.Entry(self.frame)
e.grid(row = i+1, column = 1)
self.entry[item[0]] = e
labelText = item[0] + " (" + item[1] + ") "
lb = tk.Label(self.frame,text=labelText)
lb.grid(row=i+1, column=0)
self.label[item[0]] = lb
i += 1
else:
master.destroy()
def onFrameConfigure(self, event):
'''Reset the scroll region to encompass the inner frame'''
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
if __name__ == "__main__":
root=tk.Tk()
Example(root,labelList).pack(side="top", fill="both", expand=True)
root.mainloop()