2013-05-26 2 views
0

Я новичок в ООП, но я вижу его преимущества. Я написал класс (структурированный на примере из zetcode), который создает окно и помещает в него поле ввода и кнопку. Кроме того, у меня есть функция, которая отправляет электронное письмо (мой фактический код отправки поступает из модуля sendEmail, который я сделал). Код:Как получить доступ к переменным и функциям из класса?

import sendEmail 
from tkinter import * 

class mainWindow(Frame): 

    def __init__(self, parent): 
     Frame.__init__(self, parent, bg = "#C2C2D6") 

     self.parent = parent 

     self.initUI() 

    def initUI(self): 
     self.parent.wm_title("Email") 
     self.parent.config(height = 370, width = 670) 

     email_entry = Entry(self, exportselection = 0, width = 200).pack() 
     send_button = Button(self, text = "Send", command = self.send).pack() 

     self.pack() 

    def send(self): 
     body = email_entry.get() 
     sendEmail.sendEmail("[email protected]", "[email protected]", "jacob.kudria", "2good4you!", body) 

def main(): 
    root = Tk() 
    main_window = mainWindow(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

Прежде всего, этот код не работает (отправляющая часть), но это не удивительно, я надеюсь, что ответ на этот вопрос будет исправить. Мой главный вопрос: как я могу сделать функцию отправки, и поэтому переменная email_entry (конечная функция использует эту переменную), доступную извне? Другими словами, я хочу, чтобы моя графика была в классе, а остальное - нет. В принципе, я объявляю переменную поля ввода в классе, но я хочу использовать ее за пределами класса для функции отправки. Впоследствии я хочу иметь доступ к функции отправки от внутри класса для кнопки отправки. Это связано с тем, что они глобальны ...?

Кроме того, этот код, вероятно, далеко не самый лучший, я все еще не очень хорош с python. Я буду улучшать его, когда я иду. Какие-нибудь советы по коду, помимо моего основного вопроса?

ответ

1

Сделайте email_entry поле вашего класса.

class mainWindow(Frame): 
     # ... 

    def initUI(self): 
     # ... 

     # note self here 
     self.email_entry = Entry(self, exportselection = 0, width = 200).pack() 
     # ... 

    def send(self): 
     # note self here 
     body = self.email_entry.get() 
     # ... 

В основном, в вашем коде email_entry это просто локальная переменная initUI функции (метода). Вы хотите, чтобы это поле вашего экземпляра.

+0

Что вы подразумеваете под «полем»? А также, что все еще оставляет функцию отправки внутри класса. Было бы неплохо иметь его снаружи, чтобы разделить пользовательский интерфейс и фактические действия ... Или это не очень хорошая идея ...? –

+0

@JacobKudria 'main_window' является _instance_ вашего класса. Данные, «прикрепленные» к нему, называются _fields_. Я думаю, вам будет полезно начать с какой-то базовой статьи об ООП (почти eny будет работать). И вам нужно будет узнать об основных вещах, таких как _classes_, _objects_ (_instances_), _methods_, _fields_. Это самые основные вещи в ООП, и вам нужно их понять. – kirelagin

+0

Как ни странно, я понимаю все эти вещи, кроме полей ... –

1

Проще всего, вероятно, было бы email_entry быть полем вашего класса. Однако вы также можете вернуть его из своей функции initUI:

def initUI(self): 
    self.parent.wm_title("Email") 
    self.parent.config(height = 370, width = 670) 

    email_entry = Entry(self, exportselection = 0, width = 200).pack() 
    send_button = Button(self, text = "Send", command = self.send).pack() 

    self.pack() 

    return email_entry 
+0

Куда это вернется? Если я верну его, я могу просто использовать mainWindow.email_entry? –

+0

О, право. Я не видел, что '__init__' - это то, что вызывает initUI.В этом случае единственная возможность, которую я вижу, - переместить вызов из initUI из конструктора, т. Е. 'Main_window.initUI()' после его создания. –

+0

Думаю, это вариант. Подумайте об этом, хотя это кажется лишним ненужным шагом ... Я постараюсь сделать его полем класса. –

Смежные вопросы