Как правильно получить доступ к переменной из класса в другом файле? - PullRequest
1 голос
/ 07 апреля 2019

В настоящее время я пытаюсь создать пользовательский интерфейс для будущего проекта, используя 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()

pressed.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

1 Ответ

0 голосов
/ 07 апреля 2019

Ваша проблема в том, что вы объявляете локальные переменные внутри класса, которые доступны только из функции __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()).

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