使用框架时访问tkinter列表框选择

时间:2018-12-20 16:09:34

标签: python tkinter

当用户选择一系列选项(在本例中为“打开”)时,我试图在tkinter窗口中使用框架来更改布局。

我想更新框架,但我还需要捕获列表框的选择。我试图从“ openMat”方法访问选择。

我已尽可能简化了代码。 我试了一段时间解决这个问题,尝试在网上寻找解决方案,最后求助于单击“问问题”按钮。

import tkinter as tk
LARGE_FONT = ("Verdana", 12) # font's family is Verdana, font's size is 12 

class MainWindow(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        # text for all windows
        label2 = tk.Label(self, text='title', font=LARGE_FONT)
        label2.pack(pady=10, padx=10) # center alignment

        # this container contains all the pages
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)   # make the cell in grid cover the entire window
        container.grid_columnconfigure(0,weight=1) # make the cell in grid cover the entire window

        self.frames = {} # these are pages we want to navigate to

        for F in (StartPage, Page2): # for each page
            frame = F(container, self) # create the page
            self.frames[F] = frame  # store into frames
            frame.grid(row=0, column=0, sticky="nsew") # grid it to container

        self.show_frame(StartPage) # let the first page is StartPage


    def show_frame(self, name):
        frame = self.frames[name]
        frame.tkraise()

class StartPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        ltbox = tk.Listbox(self)
        label = tk.Label(self, text='Menu', font=LARGE_FONT)

        label.grid(row=0, column = 0)
        #label.pack(pady=10, padx=10) # center alignment

        button1 = tk.Button(self, text='Open', width = 12,  # when click on this button, call the show_frame method to make PageOne appear
                            command=self.openMat)
        button1.grid(row=1, column = 0)
        #button1.pack() # pack it in


        #Insert data in listbox
        ltbox.insert( 1, "Option 1")
        ltbox.insert( 2, "Option 2")
        ltbox.insert( 3, "Option 3")
        ltbox.insert( 4, "Option 4")

        ltbox.grid(row=1, column = 4, rowspan=100, pady=0, padx=50)

        print (ltbox.curselection())

    def openMat(self):
        #This function prints the option selected and changes the frame
        print (ltbox.curselection())
        app.show_frame(Page2)



class Page2(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        label = tk.Label(self, text='Page Two', font=LARGE_FONT)
        label.pack(pady=10, padx=10)

        button1 = tk.Button(self, text='Back to Home', # likewise StartPage
                            command=lambda : controller.show_frame(StartPage))
        button1.pack()


if __name__ == '__main__':
    app = MainWindow()
    app.mainloop()

出现错误:

NameError: name 'ltbox' is not defined

感谢您阅读我的问题-非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您的问题属于范围

ltbox被定义,因此只能在类__init__的{​​{1}}函数内部使用。如果希望类的所有功能都可以访问它,则必须使它成为该类的实例属性,这可以通过使用 StartPage 完成。因此,无论您在哪里使用 ltbox ,都只需将其更改为 self