Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 20, 2014 12:08:15

agmanix
Зарегистрирован: 2014-02-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Структура и импорт самописного модуля приложения

Доброго времени суток!
Характеристики:
Python 2.7.x
Доп. модуль Grab

Проблема:
Пытаюсь написать “клиент” для сайта bash.im (только-только начал изучать питон, решил выполнить вроде как простейшую задачку), распределил весь код в 2 класса: loader(получение и сохранение данных сайта, используется модуль Grab) и gui (собственно, внешний вид на Tkinter и вызов класса loader), положил их в папку “bashclient”, в ней же создал файл “__init__.py” со следующим содержанием:

from .bashimclient import *
, после чего вызываю модуль в файле “app.py”, что лежит на уровень выше:
import sys
import os
path = os.path.abspath(os.path.dirname(sys.argv[0]))
sys.path.insert(0,path)
import bashimclient
app = bashimclient.gui()
app.mainloop()

Но на выходе получаю следующую ошибку:
Traceback (most recent call last):
  File "app.py", line 5, in <module>
    import bashimclient
  File "/media/max/SSD/Разработка/python/bash.im client/bashimclient/__init__.py", line 1, in <module>
    from .bashimclient import *
ImportError: No module named bashimclient

bashimclient/__init__.pyc создается и даже имеет вес 212 байт

В чем состоит моя ошибка и как ее исправить? Заранее спасибо за помощь!
pS: исходники прикрепил

Прикреплённый файлы:
attachment bash.im client.zip (2,6 KБ)

Офлайн

#2 Фев. 20, 2014 19:06:05

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Структура и импорт самописного модуля приложения

from .bashimclient import *
Это инит пытается найти в папке bashimclient файл bashimclient.py
“положил их в папку” - классы типа? файлы *.py это не классы, они называются модули и могут содержать много определений классов.
наверное вы хотели
__init__.py:
from loader import loader
from some_other import some_other



Отредактировано doza_and (Фев. 20, 2014 19:09:21)

Офлайн

#3 Фев. 20, 2014 19:36:03

alexsis
Зарегистрирован: 2013-07-26
Сообщения: 148
Репутация: +  9  -
Профиль   Отправить e-mail  

Структура и импорт самописного модуля приложения

Поправил код, запускается, но при нажатии на Quit (как я понял эта кнопка запрашивает следующую цитату) сл. цитата отображается некорректно. Для кэша, на мой взгляд, лучше использовать что-то вроде sqlite3.

Отредактировано alexsis (Фев. 20, 2014 19:39:55)

Прикреплённый файлы:
attachment bash.im client.zip (2,2 KБ)

Офлайн

#4 Фев. 20, 2014 22:01:38

agmanix
Зарегистрирован: 2014-02-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Структура и импорт самописного модуля приложения

спасибо! гляну уже завтра
@doza_and, т.е.

from <ИМЯ_ФАЙЛА> import <ИМЯ_КЛАССА>
?
@alexsis, знаю, это временная мера. Я просто еще не решил, что использовать для базы - sqlite3, sqlalchemy или что-то другое, что бы ты посоветовал? Желательно, чтобы было что-то вроде PHPixie ORM или Yii ActiveRecord

Офлайн

#5 Фев. 20, 2014 23:24:46

PanovSergey
От: Екатеринбург
Зарегистрирован: 2013-12-29
Сообщения: 269
Репутация: +  19  -
Профиль   Адрес электронной почты  

Структура и импорт самописного модуля приложения

from .bashimclient import *
Это инит пытается найти в папке bashimclient файл bashimclient.py
Это relative import же?

Отредактировано PanovSergey (Фев. 20, 2014 23:30:00)

Офлайн

#6 Фев. 21, 2014 05:09:23

agmanix
Зарегистрирован: 2014-02-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Структура и импорт самописного модуля приложения

@PanovSergey, я прочитал об этом в посте про zip-модули на Хабре: http://habrahabr.ru/company/acronis/blog/208378/

Офлайн

#7 Фев. 21, 2014 11:52:51

alexsis
Зарегистрирован: 2013-07-26
Сообщения: 148
Репутация: +  9  -
Профиль   Отправить e-mail  

Структура и импорт самописного модуля приложения

@alexsis, знаю, это временная мера. Я просто еще не решил, что использовать для базы - sqlite3, sqlalchemy или что-то другое, что бы ты посоветовал? Желательно, чтобы было что-то вроде PHPixie ORM или Yii ActiveRecord
Я бы взял sqlite3 для хранения таких данных.

Офлайн

#8 Фев. 21, 2014 12:38:26

agmanix
Зарегистрирован: 2014-02-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Структура и импорт самописного модуля приложения

еще вопрос - при запуске скрипта, автоматически запускает функцию refresh(), судя по всему, при создании кнопки self.btn.new, что тут не так:

# -*- coding: utf-8 -*- 
from Tkinter import *
import loader
#Empty class
class stdObject: 
	pass
#GUI class
class Gui(Frame):
	btn = stdObject()
	msg = stdObject()
	quote = {} # this dict will get quote info
	lastQuote = 0 #ID of last quote (for buttons)
	
	def nextQuote(self,direction = 'next'):
		quoteId = int(str(self.quote['id']))
		print 'id: ' + str(quoteId)
		if(direction == 'next'):
			quoteId = int(quoteId - 1)
		else:
			quoteId = int(quoteId + 1)
		print 'New id: ' + str(quoteId)
		self.quote = loader.Loader().getQuote(quoteId)
		
	def refresh(self,direction='next'):
		self.nextQuote(direction)
		self.msg.quote['text'] = self.quote['text']
		self.msg.quote.pack({'side' : 'bottom'})
	
	def createWidgets(self):
		self.msg.quote = Message(self)
		self.msg.quote['text'] = self.quote['text']
		self.msg.quote.pack({'side' : 'bottom'})
		
		self.btn.new = Button(self)
		self.btn.new['text'] = '->'
		self.btn.new['command'] = self.refresh()
		self.btn.new.pack({'side':'right'})
		
		#self.btn.back = Button(self)
		#self.btn.back['text'] = '<-'
		#self.btn.back['command'] = self.refresh(direction = 'back')
		#self.btn.back.pack({'side':'left'})
	
	def wmConfig(self):
		self.master.title('Bash.im client')
	
	
	def __init__(self, master=None):
		self.quote = loader.Loader().getLastQuote()
		self.lastQuote = self.quote['id']
		Frame.__init__(self,master)
		self.pack()
		self.createWidgets()
		self.wmConfig()

Офлайн

#9 Фев. 21, 2014 13:00:22

alexsis
Зарегистрирован: 2013-07-26
Сообщения: 148
Репутация: +  9  -
Профиль   Отправить e-mail  

Структура и импорт самописного модуля приложения

в атрибут command надо передать ф-цию, а вы передаете результат вызова ф-ции. Надо заменить

self.btn.new['command'] = self.refresh()
на
self.btn.new['command'] = self.refresh

Офлайн

#10 Фев. 21, 2014 13:14:17

agmanix
Зарегистрирован: 2014-02-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Структура и импорт самописного модуля приложения

@alexsis, спасибо!
pS: а что делать, если нужно передать параметр в функцию?

self.btn.back = Button(self)
self.btn.back['text'] = '<-'
self.btn.back['command'] = self.refresh(direction = 'back')
self.btn.back.pack({'side':'left'})

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version