В настоящее время я пытаюсь создать пользовательский интерфейс для будущего проекта, используя tkinter
. Однако у меня много проблем с настройкой некоторых основных концепций ООП.
У меня есть два файла, main.py
и pressed.py
, я пытаюсь написать функцию для нажатия кнопки в pressed.py
, но я не уверен, как я должен получить доступ к переменным в main.py
Вот ошибка, с которой я сейчас сталкиваюсь:
Class 'UI' has no 'py_entry' member
Я пытался использовать множество других сообщений о переполнении стека для справки, но ни один из них не сработал.
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()
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
Похоже, ваша проблема заключается в том, что вы объявляете локальные переменные внутри класса, которые доступны только из функции __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?