Форум сайта python.su
Привет. Ув-е,помогите разобраться с модулем appuifw,в частности с его методами app и body. Есть большое желание разобраться,но немного проблемы с англ-м! Инструкции в нете,типа “app является объектом, который не нужно создавать, так как это уже произошло при загрузке модуля — просто используем его возможности” меня не устраивают! Это пояснение практически везде в инете. Я уже понял,что:
appuifw.app.body=можно просто прикрепить к appuifw.Canvas(...) и Text() который по умолчанию,меняется на
Canvas(...),с помощью которого можно выводить графику на экран или
appuifw.app.body=canv=Canvas() и получается,что и appuifw.app.body и canv стают экз-ми класса Canvas(),через которые можно обращаться
к Canvas()-методам.Но я не понял механизм этого присваивания-appuifw.app.body=canv=Canvas(),(как меняется экран)что такое appuifw.app?
инструкция в нете - body-"Отвечает за рабочую область приложения (его «тело»)" - (я согласен,что вам понятно) а взять к примеру функцию -
def handle_redraw(rect):
if img: canvas.blit(img)- тогда эта функция за что отвечает? (appuifw.Canvas(redraw_callback=handle_redraw))
Вот у меня небольшая путанница в этих понятиях!
Офлайн
Даже не знаю, как тебе объяснить, чтоб ты понял… Спокойствие, только спокойствие.
app.body, это то, что будет показано на экране.
Canvas это “холст”.
Когда ты делаешь так:
canvas=Canvas()
app.body=canvas
Офлайн
Та вроде как не заучиваю,понимаю смысл строк,кода,работу классов! Всётаки я ведь хочу понять смысл этих выражений:“appuifw.app.body”,а не просто знать,что appuifw.app.body=canv=Canvas() - выводит холст на экран!
Как вы наверно поняли,проблем с классами у меня уже нет:
через экз-р canv можно обратиться к методам Canvas-а,или не к методам класса, а к переменным класса: допустим переменная Canvas.лобзик .
К этой переменной можно наследовав обратиться, как canv.лобзик или переназначить свою переменную canv.лобзик="ох и appuifw.app.body!"
Меня интересует,как это,какой-то галимый app.body управляет тем что на экране.
1) Что такое appuifw.app. - это класс или метод или др. модуль?
2) Получается,что такой страшный :) appuifw.app.body(который назначает,что будет на экране) становится обычным экз-м от класса appuifw.Canvas(...).
Как тогда appuifw.Canvas(...) меняет обстановку на экране?Кому он даёт задание перерисовать экран? UI ?
Отредактировано (Апрель 7, 2010 12:09:59)
Офлайн
у меня сейчас взорвется мозг….
app.body сообщает UI серверу, что выводить на экран, в данном случае говорит что за отрисовку чего либо на экране будет отвечать экземпляр класса Canvas(), и поэтому когда UI сервер требует перерисовать экран, после каких то событий (например разворачивание свернутого приложения), вызывается функция, которая задана в конструкторе класса Canvas - redraw_callback, в которой ты сам задаешь, что же нужно отрисовать на экране ( canvas.blit(img) ).
Что тут может быть непонятным?
python4ikу вас проблема с чем то другим……
Как вы наверно поняли,проблем с классами у меня уже нет:
Офлайн
И хватит заворачивать текст в тег codeЭто понятно,но тут такая фишка:
import appuifw, e32, key_codes, graphics
n=0
WHITE = (255,255,255)
RED = (255,0,0)
BLUE = (0,0,255)
YELLOW = (255,255,0)
def draw_rectangle():
img.rectangle((50,100,100,150), fill = YELLOW) - это прорисовка квадрата
def draw_point():
img.point((90,50), outline = RED, width = 30) - это кружок
def draw_text():
img.text((10,40), u'Hello', fill = WHITE) - это бит его за-ногу - текст
def handle_redraw(rect):
if img: canvas.blit(img)
def handle_event(event):
global n
ev = event['keycode']
if event['type'] == appuifw.EEventKeyDown:
img.clear(BLUE) - здесь я так понял очищается всё,что было на экране в синий цвет,
после нажатия любой клавы! Тоесть,даже если нажмётся нижеприведённая клава,сначало очищается экран(тип обр.-ки клавы)
if ev == key_codes.EKeyUpArrow:
draw_point() - это пошла уже сама обработка определённой клавиши(вызов кружка)
elif ev == key_codes.EKeyRightArrow:
draw_text() - ...
elif ev == key_codes.EKeyDownArrow:
draw_rectangle() - ...
elif ev == key_codes.EKeyLeftArrow:
draw_point()
draw_text()
draw_rectangle() - вызываются все сразу!
n+=1 - вот я добавил в этот код n.После запуска этого кода,допустим если вообще
не нажимать кнопки,и сразу выйти,то n=2 после выхода из проги и проверки n.А если нажать
любую кнопку один раз и выйти,то n=5! Почему такие значения n?
handle_redraw(()) - почему,если убрать это выражение,то не работает прога? Тоесть работает,
но нет реагирования на кнопки, в нижней части как и должно быть синий цвет,а большая часть экрана белая!
def quit():
app_lock.signal()
img = None
canvas = appuifw.Canvas(redraw_callback=handle_redraw,
event_callback = handle_event)
appuifw.app.body = canvas
appuifw.app.screen = 'full'
appuifw.app.exit_key_handler = quit
w, h = canvas.size
img = graphics.Image.new((w, h))
img.clear(BLUE)
app_lock = e32.Ao_lock()
app_lock.wait()
Офлайн
python4ikА потому что у вас из головы вылетает все, что вам говорят!
handle_redraw(()) - почему,если убрать это выражение,то не работает прога? Тоесть работает,но нет реагирования на кнопки, в нижней части как и должно быть синий цвет,а большая часть экрана белая!
Офлайн