Можно ли получить доступ к записи в текстовом поле из одного класса (и добавить к нему) из другого класса?В этом случае это будет от Page2 - PullRequest
0 голосов
/ 08 июля 2019

Я не могу найти способ получить доступ к этому текстовому полю и добавить к нему другой класс, используя Tkinter.

Я не могу использовать метод, который использовал раньше (вызывая другие записи StringVar()), что привело к остановке в моем программировании. Поскольку текстовое поле не может быть названо StringVar(), я не понимаю, как мне это сделать.

import tkinter as tk

class MainWindow(tk.Tk):

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

        tk.Tk.__init__(self, *args, **kwargs)
        self.geometry("1350x750")

        container = tk.Frame(self)
        container.grid(row=0, column=0)

        container.config(bg="gray20")

        self.frames = {}

        for F in (ReservationPage, ReceiptPage):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0)

        self.show_frame(ReservationPage)

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


class ReservationPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.MainFrame = tk.Frame(self, width=1350, height=700, bg="gray20")
        self.MainFrame.grid(row=0,column=0)
        self.MoorFrame = tk.LabelFrame(self, bg="gray20", width=300, height=150)
        self.MoorFrame.place(x=450, y=120)

        ReceiptPageButton1 = tk.Button(self, text="Receipts", font=("Helvetica", 20, "bold"),bg="gray20", fg="light grey",
                                       bd=0,command=lambda: controller.show_frame(ReceiptPage))
        ReceiptPageButton1.place(x=100, y=30)


class ReceiptPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.MainFrame = tk.Frame(self, width=1350, height=700, bg="gray20")
        self.MainFrame.grid(row=0,column=0)

        ReservationPageButton1 = tk.Button(self, text="Reservations", font=("Helvetica", 20, "bold"),bg="gray20", fg="light grey",
                                       bd=0,command=lambda: controller.show_frame(ReservationPage))
        ReservationPageButton1.place(x=80, y=30)

        ReceiptBox = tk.Text(self, height=20, width=137, font=("Helvetica",11,"bold"))
        ReceiptBox.place(x=27, y=165)

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

У вас есть контроллер, который предназначен для связи между страницами. Вам нужно обновить его, чтобы иметь функцию, которая возвращает нужную страницу, и оттуда вы можете получить доступ к любому из атрибутов этой страницы.

Сначала добавьте следующее определение к MainWindow:

def get_page(self, page_class):
    return self.frames[page_class]

Затем сохраните виджет Text в переменной экземпляра:

class ReceiptPage(tk.Frame):
    def __init__(self, parent, controller):
        ...
        self.ReceiptBox = tk.Text(self, ...)
        ...

С этим вы можете получить доступ к ReceiptBox с любой другой страницы, например:

receipt_page = self.controller.get_page(ReceiptPage)
receipt_page.delete("1.0", "end")

В вашем случае вы, вероятно, захотите привязать свою кнопку к функции, которая записывает квитанцию ​​и затем переключается на нее.

class ReservationPage(tk.Frame):

    def __init__(self, parent, controller):
        ...
        ReceiptPageButton1 = tk.Button(..., command=self.generate_receipt)
        ...

    def generate_receipt(self):
        receipt_page = self.controller.get_page(ReceiptPage)
        receipt_page.ReceiptBox.delete("1.0", "end")
        receipt_page.ReceiptBox.insert("end", "Here is your receipt...")
        self.controller.show_frame(ReceiptPage)
0 голосов
/ 08 июля 2019

Вот пример. Обратите внимание, я также удалил много другого бесполезного кода. Единственное, что я не сделал, я рекомендую вам сделать, это прекратить использовать place(). Научитесь использовать grid() и pack() вместо этого. Это немного сложнее в изучении, но как только вы узнаете, как они работают, гораздо проще программировать, потому что tkinter определит все эти местоположения пикселей для вас.

import tkinter as tk

bg_color = "gray20"
button_style = dict(
    font=("Helvetica", 20, "bold"),
    bg=bg_color,
    fg="light grey",
    bd=0)

class MainWindow(tk.Tk):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.geometry("1350x750")

        self.frames = {}
        for F in (ReservationPage, ReceiptPage):
            frame = F(self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.show_frame(ReservationPage)

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

class ReservationPage(tk.Frame):
    def __init__(self, parent, **kwargs):
        super().__init__(parent, bg=bg_color, **kwargs)
        self.MoorFrame = tk.LabelFrame(self, bg=bg_color, width=300, height=150)
        self.MoorFrame.place(x=450, y=120)

        ReceiptPageButton1 = tk.Button(self, text="Receipts", command=lambda: parent.show_frame(ReceiptPage), **button_style)
        ReceiptPageButton1.place(x=100, y=30)

        test_button = tk.Button(self, text="Test add text", command=self.add, **button_style)
        test_button.place(x=100, y=100)

    def add(self):
        textbox = self.master.frames[ReceiptPage].ReceiptBox
        textbox.insert(tk.END, "This is only a test\n")

class ReceiptPage(tk.Frame):
    def __init__(self, parent, **kwargs):
        super().__init__(parent, bg=bg_color, **kwargs)

        ReservationPageButton1 = tk.Button(self, text="Reservations", command=lambda: parent.show_frame(ReservationPage), **button_style)
        ReservationPageButton1.place(x=80, y=30)

        # using a name that starts with "self." makes this an instance variable
        self.ReceiptBox = tk.Text(self, height=20, width=137, font=("Helvetica",11,"bold"))
        self.ReceiptBox.place(x=27, y=165)

def main():
    root = MainWindow()
    root.mainloop()

if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...