Как обновить список при изменении вида в Tkinter? - PullRequest
0 голосов
/ 30 марта 2019

Мне нужно обновить список при изменении вида, но я не знаю, как это сделать. На первой странице я добавляю некоторые элементы в список, а на второй он должен отображать все элементы в списке.

# -*- coding: utf-8 -*-

from tkinter import *


tb1 = [["Kofola", "0,5","30"]]


class SeaofBTCapp(Tk):

    def __init__(self, *args, **kwargs):

        Tk.__init__(self, *args, **kwargs)
        container = Frame(self)

        container.pack(side="top", fill="both", expand = True)

        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for F in (StartPage, PageOne):

            frame = F(container, self)

            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(StartPage)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()


class StartPage(Frame):

    def __init__(self, parent, controller):
        Frame.__init__(self,parent)
        label = Label(self, text="Start Page")
        label.pack(pady=10,padx=10)

        button = Button(self, text="Visit Page 1",
                            command=lambda: controller.show_frame(PageOne))
        button.pack()

        button2 = Button(self, text="add",
                            command=self.add)
        button2.pack()

    def add(self):
        tb1.append(["Radegast", "0,5","30"])
        print(tb1)



class PageOne(Frame):

    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        label = Label(self, text="Page One!!!")
        label.pack(pady=10,padx=10)

        button1 = Button(self, text="Back to Home",
                            command=lambda: controller.show_frame(StartPage))
        button1.pack()

        self.bill=Listbox(self)
        self.bill.pack()



        for item in tb1:
            co=" ".join(str(x) for x in item)
            self.bill.insert(END, co)

app = SeaofBTCapp()
app.mainloop()

1 Ответ

2 голосов
/ 30 марта 2019

В классе PageOne Вы читаете список tb1 только один раз, в __init__().Чтобы изменения в tb1 были видны в списке, вы также должны обновить список новым измененным списком.

Существует также проблема со списком.Как это определено в глобальном пространстве имен, ваше приложение будет зависеть от этого.Я бы посоветовал вам определить его в функции SeaofBTCapp() __init__(), а затем получить к нему доступ через объект controller:

class SeaofBTCapp(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        self.tb1 = [["Kofola", "0,5","30"]]
        ... etc ...

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

    def add(self):
        self.controller.tb1.append(["Radegast", "0,5","30"])
        ... etc ...

И затем добавить метод update() в PageOne() класс, который обновляет список и вызывает его из метода add().Я звоню с помощью метода контроллера update_pageone().Смотрите полный пример ниже:

from tkinter import *

class SeaofBTCapp(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        self.tb1 = [["Kofola", "0,5","30"]] # Create instance variable tb1
        container = Frame(self)
        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        for F in (StartPage, PageOne):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(StartPage)

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

    def update_pageone(self):
        self.frames[PageOne].update()   # Call update on PageOne

class StartPage(Frame):
    def __init__(self, parent, controller):
        self.controller = controller    # Remember the controller
        Frame.__init__(self,parent)
        label = Label(self, text="Start Page")
        label.pack(pady=10,padx=10)

        button = Button(self, text="Visit Page 1",
                            command=lambda: self.controller.show_frame(PageOne))
        button.pack()
        button2 = Button(self, text="add", command=self.add)
        button2.pack()

    def add(self):
        self.controller.tb1.append(["Radegast", "0,5","30"])
        self.controller.update_pageone()    # Asking controller for an update


class PageOne(Frame):
    def __init__(self, parent, controller):
        self.controller = controller    # Remember the controller
        Frame.__init__(self, parent)
        label = Label(self, text="Page One!!!")
        label.pack(pady=10,padx=10)

        button1 = Button(self, text="Back to Home",
                            command=lambda: controller.show_frame(StartPage))
        button1.pack()

        self.bill = Listbox(self)
        self.bill.pack()

        for item in controller.tb1:
            co = " ".join(str(x) for x in item)
            self.bill.insert(END, co)

    def update(self):
        # Delete all from Listbox bill
        self.bill.delete(0, 'end')
        # Add revised table into Listbox bill
        for item in self.controller.tb1:
            co = " ".join(str(x) for x in item)
            self.bill.insert(END, co)

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