Форум сайта python.su
Доброе время суток!
Есть программа, имеющая следующую структуру:
Папка программы (C:\\MyLittleProgramm - дело происходит под виндой):
my_little_programm.py - файл, содержащий меню программы
Подпапки:
- common - модуль с общими функциями и классами, используемыми в большинстве модулей программы (common_func.py, __init__.py)
- face - модуль, содержащий классы для формирования GUI программы (используется во всех остальных модулях module1-module4)
- module1 (modules1_func.py, __init__.py)
- module2
- module3
- module4
module1-module4 - модули, реализующие различный функционал программы. Файлы modules1_func.py имеют приблизительно следщующую структуру:
from Tkinter import *
def func1() - определяем одну функцию
def func2() - определяем вторую функцию
def func3() - определяем 3-ю функцию
class MyClass(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack({'padx':5, 'pady':5})
внутри этого класса имеются такие элементы, как флажки и переключатели
def open_myclass():
app=MyClass(master=Tk())
app.master.title(u'Модуль N: афигенно-сложные расчеты того-то')
app.mainloop()
import os, sys
sys.path.append(os.path.dirname(__file__))
from module1.modules1_func import open_myclass11
from module2.modules1_func import open_myclass12
root = Tk()
root.title(u'Моя программулинка')
bar=Menu(root)
menu1 = Menu(bar)
menu1 .add_command(label=u"Отчет 1...", command=open_myclass11)
menu1 .add_command(label=u"Отчет 2...", command=open_myclass12)
...
root.config(menu=bar)
root.mainloop()
Офлайн
Как ты вызываешь после импортирования?
Офлайн
4kptВообще в коде выше указано:
Как ты вызываешь после импортирования?
from module1.modules1_func import open_myclass11
...
menu1.add_command(label=u"Отчет 1...", command=open_myclass11)
from module2.modules1_func import open_myclass21
...
def newdef():
print u'Запускаем форму для отчета 2'
open_myclass21()
...
menu1.add_command(label=u"Отчет 2...", command=newdef)
Отредактировано (Дек. 20, 2011 08:45:36)
Офлайн
Попробуй метод __call__ описать после __init__ в классе, который вызываешь… Для задачи вызова отдельных частей одного модуля в другом я использую его. У меня такое ощущение, что ты вызываешь класс без методов но с состоянием.
Офлайн
Собственно да, вызываемые классы имеют собственные методы, но они используются в рамках процедур самого класса. При определении экземпляра класса (app=MyClass(master=Tk())) в процедуре запуска никакие методы не задействуются. Не понятно, что прописывать в методе __call__
Офлайн
похоже все таки дело не в этом:
если сделать скрипт, который будет импортировать процедуру, запускающую класс с формой вот такого вида:
import os, sys
sys.path.append(os.path.dirname(__file__))
from module1.modules1_func import open_myclass11
if __name__=='__main__': open_myclass11()
import os, sys
sys.path.append(os.path.dirname(__file__))
from module1.modules1_func import open_myclass11
def asdf():
root=Tk()
btn=Button(root, width=20, text=u'кнопка1')
btn.bind('<Button-1>', lambda _: open_myclass11())
btn.pack()
root.mainloop()
if __name__=='__main__': asdf()
Офлайн
Возможно я все не так понимаю и поэтому повторяюсь: для запуска отдельных частей одного модуля при работе другого ты все как-то витиевато делаешь. Много проще использовать прямой вызов через метод __call__ с передачей определенных параметров, и соответственно с возвращением определенного набора значений (набора - в смысле группы). Зачем в этой задаче использовать наследование (я не до конца понимаю) - ты же фактически не модернизируешь суперклас в связи з тем-то и тем-то, а просто используешь функциональность предыдущего класа. Зачем же тогда наследовать? Легче написать модульную систему и не париться…
Офлайн
Dr.LivsiБез кода(урезанного, с теми самыми флажками), можно посоветовать почитать документацию или умную книжку.
то почему-то не работают флажки и переключатели
Офлайн
sp3Ну да… Хотя мне кажеться, причина в отдельном выносе функции запуска класса (зачем?) вне класса. Потом выполняется последующий вызов класса через функцию для использования его методов???? Как-то все очень сложно. Если нужно использовать класс - пожалуйста - сделайте прямой вызов, а в качестве аргумента передайте root (в смысле Tkinter.Tk()) что-бы объект отображался, ну или как-то так…
Отредактировано (Дек. 21, 2011 18:59:08)
Офлайн
буду упрощать код и выложу пример
Офлайн