Как правильно получить доступ к переменной из класса в другом файле?

В настоящее время я пытаюсь создать пользовательский интерфейс для будущего проекта, используя tkinter. Однако у меня много проблем с настройкой некоторых основных концепций ООП.

У меня есть два файла, main.py и pressed.py, я пытаюсь написать функцию для нажатия кнопки в pressed.py, но я не уверен, как я должен получить доступ к переменным в main.py

Вот ошибка, с которой я сейчас сталкиваюсь:

Class 'UI' has no 'py_entry' member 

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

main.py

import tkinter as tk
import os
import geocoder

from tkinter import messagebox
from PIL import Image
from PIL import ImageTk

import pressed

# Paths
assets_path = "./assets/"

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

        # Set window title
        parent.title("geo-location-data")

        # Set window geometry
        parent.geometry("800x600")

        # Address entry label
        py_label = tk.Label(parent, text = "Emter an addres:", font=("Helvetica", 12))
        py_label.place(x=0, y=0)

        # Address entry field
        py_entry = tk.Entry(parent, font=("Helvetica", 12))
        py_entry.place(x=130, y=2)

        # Open button_normal.png
        button_normal_img = Image.open(assets_path + "button_normal.png")

        # Resize button_normal.png
        button_normal_img_resize = button_normal_img.resize((16, 16), Image.BILINEAR)
        button_normal_img_resize_format = "resized_button_normal" + ".png"

        # Set path
        path_for_button_normal = os.path.join(assets_path, button_normal_img_resize_format)

        # Save to path
        button_normal_img_resize.save(path_for_button_normal)

        # Open saved image
        button_normal_img_r_open = Image.open(assets_path + "resized_button_normal.png")
        button_normal_img_r_open = ImageTk.PhotoImage(button_normal_img_r_open)

        #def button_pressed(self):
            # If address entry field is blank
            #if (py_entry.index("end") == 0):
                #messagebox.showerror("Error", "Entry field was left blank.")
                #return self
            #else:
                #print("test")
                #return self

        # Pressed

        # ADD COMMAND #
        py_button = tk.Button(parent, font=("Helvetica", 12), width=16, height=16, image=button_normal_img_r_open)
        py_button.place(x=320, y=2)

if __name__ == "__main__":
    root = tk.Tk()
    UI(root).pack(side = "top", fill = "both", expand=True)
    root.mainloop()

нажал.py

from sample import main

from tkinter import messagebox

class Pressed(main.UI):
    def __init__(self):
        def button_press(self):
            # This is where I'm getting the error
            if (main.UI.):
                messagebox.showerror("Error", "Address entry field was left blank.")
                return self
            else:
                print("Button pressed!")
                return self
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, ваша проблема заключается в том, что вы объявляете локальные переменные внутри класса, которые доступны только из функции __init__(). В Python есть способ создавать переменные класса, объявляя их внутри класса (вне метода) или вызывая self.variable_name. Затем вы можете получить доступ к этой переменной, вызвав self.variable_name каждое место внутри класса.
self — это ссылка на текущий экземпляр вашего класса.

В вашем примере вы, вероятно, захотите объявить переменную с помощью ключевого слова self:

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

        self.py_entry = tk.Entry(parent, font=("Helvetica", 12))
        self.py_entry.place(x=130, y=2)

Затем вы сможете получить доступ к полю py_entry после создания экземпляра класса UI (вызов UI()).

Эй, спасибо за ответ! Я попытался добавить себя к переменной, но я все еще не могу получить к ней доступ, это дает мне ту же ошибку. Есть ли что-то, что мне нужно изменить в классе или функции, которую я написал в press.py?

k0ru 06.04.2019 23:35

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

Karl 06.04.2019 23:40

Это сработало, я просто сначала неправильно создал экземпляр. Спасибо!

k0ru 06.04.2019 23:58

Другие вопросы по теме