Доступ к выбору списка tkinter при использовании фреймов - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь использовать фреймы в окне 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 голосов
/ 20 декабря 2018

Ваша проблема имеет Область действия .

ltbox определена и, следовательно, может использоваться только внутри функции __init__ класса StartPage.Если вы хотите, чтобы он был доступен для всех функций класса, вы должны сделать его атрибутом экземпляра класса, что делается с помощью self.Поэтому, где бы вы ни использовали ltbox , просто измените его на self.ltbox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...