Python 2.7 TKinter滚动画布,小部件和非滚动区域

时间:2017-02-02 17:37:59

标签: python python-2.7 tkinter scrollbar tkinter-canvas

我正在尝试创建一个既有滚动部分又有非滚动部分的用户界面。在滚动部分将是标签和用户条目的列表,在不可滚动部分中将是有关如何填写条目的信息。我正在考虑使用一个单独的窗口来显示信息,但想知道是否可以在同一个窗口中显示它们。

我已经调整了对此问题的响应中的代码: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()

0 个答案:

没有答案
相关问题