Как мне вызвать метку кадра из класса Tk на Tkinter? - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь вызвать метку другого фрейма из основного класса Tk и по какой-то причине не могу понять это.Например, здесь я пытаюсь сделать так, чтобы с помощью меню файлов я мог получить каталог файлов и затем показать его в метке под PageOne.Но, к сожалению, функция "open_exposure" не может достигнуть выставочной метки в PageOne.Хотелось бы помочь с этим.

import tkinter as tk
#from tkinter import ttk #css for tkintr
from tkinter import filedialog as fd


class NewClass(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        tk.Tk.wm_title(self, "Complete Test")

        container = tk.Frame(self)
        container.pack(side = "top", fill = "both", expand = True) #expand will expand window
        container.grid_rowconfigure(0, weight = 1)
        container.grid_columnconfigure(0, weight = 1)

        menubar = tk.Menu(container)
        filemenu = tk.Menu(menubar, tearoff = 0)
        filemenu.add_command(label="Import File", command = lambda: self.open_exposure(PageOne))
        filemenu.add_separator()
        filemenu.add_command(label="Exit",command= self.destroy)
        menubar.add_cascade(label="File", menu = filemenu)

        tk.Tk.config(self, menu = menubar)
        self.frames = {}

        for F in (PageOne, PageTwo):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column = 0, sticky = "nsew") #grid is other option to pack. sticky means north south east west (alignment + stretch)

        self.show_frame(PageOne)

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

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

def open_exposure(self, cont):

    file_path = fd.askopenfilename()
    label1 = self.get_page(PageOne)
    label1.randomtext.set(file_path)

class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        self.controller = controller
        randomtext = tk.StringVar()
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text = """I'm Page One.""")
        label.pack(pady = 10, padx = 10)
        exposureLabel = tk.Label(self, text = randomtext.get())
        exposureLabel.pack(pady = 10, padx = 10)

class PageTwo(tk.Frame):
    def __init__(self, parent, controller):
        self.controller = controller
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text = """I'm Page Two.""")
        label.pack(pady = 10, padx = 10)


app = NewClass()
app.geometry("1200x700")
app.mainloop()

Редактировать: Мой вопрос был отмечен как дубликат Брайаном Оукли, который опубликовал чрезвычайно полезный ответ здесь .Однако, попробовав его ответ, я не смог заставить его работать в моей ситуации.

Его решение относится к доступу к переменной StringVar из другого класса.Мой вопрос заключается в том, что я пытаюсь отредактировать метку на PageOne из меню «Файл».

Так что в настоящее время моя проблема заключается в том, что я все еще не могу получить доступ к своей экспозиции через NewClass.Я получаю сообщение об ошибке «Объект PageOne не имеет атрибута randomtext», даже после использования метода get_page Брайана Оклейна.Решение, вероятно, очевидно для некоторых опытных пользователей Tkinter, но для меня оно совершенно смущает.Спасибо.

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