Перейти к содержимому
Korean Random
SV_Kirov

Как создать форму(Окно) в ангаре

Рекомендуемые сообщения

(изменено)

Доброе время суток, прошу помощи. Подскажите как на питоне создать форму(окно) в ангаре. Например как в моде протанков(оповещение о выходе новой версии модов).

Буду очень благодарен. Сразу скажу, что за питон взялся неделю назад. Сам программирую в delphi и C#

Изменено пользователем SV_Kirov

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах
(изменено)

как на питоне создать форму(окно)

Здесь нужен Flash. Из питона можно вызвать swf.

mod_TestWindow.py

from gui.Scaleform.framework import g_entitiesFactories, ViewSettings
from gui.Scaleform.framework import ViewTypes, ScopeTemplates
from gui.Scaleform.framework.entities.abstract.AbstractWindowView import AbstractWindowView
from gui.app_loader import g_appLoader
from gui.shared.utils.key_mapping import getBigworldNameFromKey

class TestWindow(AbstractWindowView):

    def __init__(self):
        super(TestWindow, self).__init__()

    def _populate(self):
        super(TestWindow, self)._populate()

    def onWindowClose(self):
        self.destroy()


_alias = 'TestWindow'
_url = 'TestWindow.swf'
_type = ViewTypes.WINDOW
_event = None
_scope = ScopeTemplates.VIEW_SCOPE


_settings = ViewSettings(_alias, TestWindow, _url, _type, _event, _scope)
g_entitiesFactories.addSettings(_settings)

def onhandleKeyEvent(event):
    key = getBigworldNameFromKey(event.key)
    if key == 'KEY_F10':
        g_appLoader.getDefLobbyApp().loadView(_alias)
    return None

from gui import InputHandler
InputHandler.g_instance.onKeyDown += onhandleKeyEvent

TestWindow.as

package
{
    import net.wg.infrastructure.base.AbstractWindowView;

    public class TestWindow extends AbstractWindowView
    {
        public function TestWindow()
        {
            super();
        }

        override protected function onPopulate() : void
        {
            super.onPopulate();
            width = 600;
            height = 400;
            window.title = "Test Window";
        }
    }
}

Теперь в FlashDevelop создаем AS3 Project

Название: TestWindow

Настройки проекта:

post-16296-0-27027100-1435582323_thumb.png

И не забываем подключить внешнюю библиотеку wg.swc, собранную в XFW

Также можно взять эту библиотеку у P0LIR0ID'а: https://bitbucket.org/P0LIR0ID/modslist/src/master/source/ModsListPopover/libraries/

Project-> Properties-> Compiler Options-> External Libraries

post-16296-0-19145300-1436011574_thumb.png

Собираем TestWindow.swf и кладем в res_mods\<wot_ver>\gui\flash\

Нажимаем F10. Результат:

post-16296-0-44443900-1435582486_thumb.jpg

 

Теперь добавим 2 кнопки и текстовое поле:

TestWindow.as

package
{
    import net.wg.infrastructure.base.AbstractWindowView;
    import net.wg.gui.components.controls.SoundButton;
    import flash.text.*;

    public class TestWindow extends AbstractWindowView
    {
        private var soundButtonOk     : SoundButton;
        private var soundButtonCancel : SoundButton;
        private var textFieldTest     : TextField;

        public function TestWindow()
        {
            super();
        }

        override protected function onPopulate() : void
        {
            super.onPopulate();
            width = 600;
            height = 400;
            window.title = "Test Window";

            textFieldTest = new TextField();
            textFieldTest.width = 590;
            textFieldTest.height = 360;
            textFieldTest.x = 5;
            textFieldTest.y = 0;
            textFieldTest.multiline = true;
            textFieldTest.selectable = false;
            textFieldTest.defaultTextFormat = new TextFormat("$FieldFont", 10, 0xFFFFFF);
            textFieldTest.text = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.";
            addChild(textFieldTest);

            soundButtonOk = addChild(App.utils.classFactory.getComponent("ButtonNormal", SoundButton, {
                width: 100,
                height: 25,
                x: 195,
                y: 365,
                label: "Ok"
            })) as SoundButton;

            soundButtonCancel = addChild(App.utils.classFactory.getComponent("ButtonNormal", SoundButton, {
                width: 100,
                height: 25,
                x: 305,
                y: 365,
                label: "Cancel"
            })) as SoundButton;
        }
    }
}

post-16296-0-49333900-1435586373_thumb.jpg

 

Также можно использовать диалоги подтверждения.

from gui.Scaleform.daapi.view.dialogs import SimpleDialogMeta, DIALOG_BUTTON_ID
from gui.shared.utils.key_mapping import getBigworldNameFromKey
from gui import DialogsInterface
from gui import InputHandler

class MyConfirmDialogButtons():
    def getLabels(self):
        return [{'id': DIALOG_BUTTON_ID.SUBMIT,'label': 'Ok','focused': True}, \
        {'id': DIALOG_BUTTON_ID.CLOSE,'label': 'Cancel','focused': False}]

def openTestDialog():
    _message = 'Test Message'
    _title = 'Test Title'
    _buttons = MyConfirmDialogButtons()
    meta = SimpleDialogMeta(message=_message, title=_title, buttons=_buttons)
    DialogsInterface.showDialog(meta, lambda result: onClickAction(result))

def onClickAction(result):
    if result:
        print 'PRESS OK'
    else
        print 'PRESS CANCEL'

def onhandleKeyEvent(event):
    key = getBigworldNameFromKey(event.key)
    if key == 'KEY_F11':
        openTestDialog()
    return None

InputHandler.g_instance.onKeyDown += onhandleKeyEvent

post-16296-0-89615100-1435600499_thumb.jpg

 

Можно еще посмотреть видеогайд от WG:

Изменено пользователем ShadowHunterRUS
  • Нравится 12

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах
(изменено)

Хм.. Тогда я не совсем понимаю как работает WoT Versus, насколько я смотрю там нет ни одного swf файла, но при это при нажатии на f10 показывает форму с информацией.

post-32714-0-98776300-1435501078_thumb.jpg

Изменено пользователем SV_Kirov

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах

Хм.. Тогда я не совсем понимаю как работает WoT Versus, насколько я смотрю там нет ни одного swf файла, но при это при нажатии на f10 показывает форму с информацией.

 

Это окно веб-страницы с использованием Awesomium.

  • Нравится 3

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах

Это окно веб-страницы с использованием Awesomium.

Тогда собственно логичный вопрос, как его можно заюзать?

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах
(изменено)

Awesomium в примерах


Простой пример использования Awesomium


Python

from gui import game_control
from adisp import process
from gui.shared.utils.key_mapping import getBigworldNameFromKey

@process
def openBrowserWindow():
    _url = 'http://yandex.ru'
    _title = 'Test Title'
    _width = 600
    _height = 400
    _browserSize = [_width, _height]
    browserID = yield game_control.g_instance.browser.load(_url, _title, showActionBtn=False, browserSize=_browserSize)
    browser = game_control.g_instance.browser.getBrowser(browserID)

def onhandleKeyEvent(event):
    key = getBigworldNameFromKey(event.key)
    if key == 'KEY_F10':
        openBrowserWindow()
    return None

from gui import InputHandler
InputHandler.g_instance.onKeyDown += onhandleKeyEvent

post-16296-0-86079300-1435506672_thumb.jpg


Передача данных из Awesomium в Python с использованием console.log()


Python

from gui import game_control
from adisp import process
from gui.shared.utils.key_mapping import getBigworldNameFromKey
from ResMgr import resolveToAbsolutePath

oldOnAddConsoleMessage = None

def newOnAddConsoleMessage(message, lineNumber, source):
    print(message)
    oldOnAddConsoleMessage(message, lineNumber, source)

@process
def openBrowserWindow():
    global oldOnAddConsoleMessage
    _url = 'file:///{0}'.format(resolveToAbsolutePath('../res_mods/index.html'))
    _title = 'Test console.log()'
    _width = 800
    _height = 600
    _browserSize = [_width, _height]
    browserID = yield game_control.g_instance.browser.load(_url,  _title, showActionBtn=False, browserSize=_browserSize)
    browser = game_control.g_instance.browser.getBrowser(browserID)
    oldOnAddConsoleMessage = browser._WebBrowser__browser.script.onAddConsoleMessage
    browser._WebBrowser__browser.script.onAddConsoleMessage = newOnAddConsoleMessage

def onhandleKeyEvent(event):
    key = getBigworldNameFromKey(event.key)
    if key == 'KEY_F10':
        openBrowserWindow()
    return None

from gui import InputHandler
InputHandler.g_instance.onKeyDown += onhandleKeyEvent

./res_mods/index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <script type="text/javascript">
function write_to_log()
{
  console.log(document.getElementById('_in_text').value);
}
    </script>
  </head>
  <body bgcolor="white">
    <input id="_in_text" type="text" />
    <a href="#" onclick="write_to_log();return false;">Отправить сообщение в питон</a>
  </body>
</html>


post-16296-0-42470400-1447231235_thumb.jpg

Увидим в логе:
...
INFO: test message
...

Выполнение JS-кода(отправленного из Python) на web-странице


Python

from gui import game_control
from adisp import process
from gui.shared.utils.key_mapping import getBigworldNameFromKey
from ResMgr import resolveToAbsolutePath

browser = None

def onLoadEnd(url, isLoaded):
    js_code = "document.getElementById('_in_text').value = 'Hello from python!';"
    browser._WebBrowser__browser.executeJavascript(js_code, '')

@process
def openBrowserWindow():
    global browser
    _url = 'file:///{0}'.format(resolveToAbsolutePath('../res_mods/index.html'))
    _title = 'Test executeJavascript'
    _width = 800
    _height = 600
    _browserSize = [_width, _height]
    browserID = yield game_control.g_instance.browser.load(_url,  _title, showActionBtn=False, browserSize=_browserSize)
    browser = game_control.g_instance.browser.getBrowser(browserID)
    browser.onLoadEnd += onLoadEnd

def onhandleKeyEvent(event):
    key = getBigworldNameFromKey(event.key)
    if key == 'KEY_F10':
        openBrowserWindow()
    return None

from gui import InputHandler
InputHandler.g_instance.onKeyDown += onhandleKeyEvent

./res_mods/index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
  </head>
  <body bgcolor="white">
    <input id="_in_text" type="text" />
  </body>
</html>


post-16296-0-32359600-1447232590_thumb.jpg


Обработка питоном переходов по url внутри браузера


Python

from gui import game_control
from gui import SystemMessages
from adisp import process
from gui.shared.utils.key_mapping import getBigworldNameFromKey
from ResMgr import resolveToAbsolutePath

oldOnBeginLoadingFrameCB = None
browser = None

def newOnBeginLoadingFrameCB(frameId, isMainFrame, url):
    if url.startswith('gamecall://'):
        if browser._WebBrowser__browser:
            browser._WebBrowser__browser.stop()
        _url = url[11:]
        if _url.startswith('showWarning='):
            msg = _url[12:]
            SystemMessages.pushMessage(msg, SystemMessages.SM_TYPE.Warning)
        elif _url.startswith('showInformation='):
            msg = _url[16:]
            SystemMessages.pushMessage(msg, SystemMessages.SM_TYPE.Information)
    else:
        oldOnBeginLoadingFrameCB(frameId, isMainFrame, url)

@process
def openBrowserWindow():
    global oldOnBeginLoadingFrameCB, browser
    _url = 'file:///{0}'.format(resolveToAbsolutePath('../res_mods/index.html'))
    _title = 'Test url request'
    _width = 800
    _height = 600
    _browserSize = [_width, _height]
    browserID = yield game_control.g_instance.browser.load(_url,  _title, showActionBtn=False, browserSize=_browserSize)
    browser = game_control.g_instance.browser.getBrowser(browserID)
    oldOnBeginLoadingFrameCB = browser._WebBrowser__browser.script.onBeginLoadingFrame
    browser._WebBrowser__browser.script.onBeginLoadingFrame = newOnBeginLoadingFrameCB

def onhandleKeyEvent(event):
    key = getBigworldNameFromKey(event.key)
    if key == 'KEY_F10':
        openBrowserWindow()
    return None

from gui import InputHandler
InputHandler.g_instance.onKeyDown += onhandleKeyEvent

./res_mods/index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
  </head>
  <body bgcolor="white">
    <iframe name="frame_1" style="display:none"></iframe>
    <a href="gamecall://showWarning=TEST_WARNING" target="frame_1">Показать уведомление</a>
    <br />
    <a href="gamecall://showInformation=TEST_INFORMATION" target="frame_1">Показать информацию</a>
  </body>
</html>


post-16296-0-33031300-1447238039_thumb.jpg

Изменено пользователем ShadowHunterRUS
  • Нравится 9
  • Не нравится 1

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах

Спасибо

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах
(изменено)

Спасибо

Если что-то ещё нужно - обращайся

Изменено пользователем ShadowHunterRUS
  • Нравится 1

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах

Если что-то ещё нужно - обращайся

Хорошо

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах

Если что-то ещё нужно - обращайся

 

Т.е. я могу забацать html справочку в пару страничек скажем для своего мода/сборки и локально их в окне грузануть как выше?

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах
(изменено)

Т.е. я могу забацать html справочку в пару страничек скажем для своего мода/сборки и локально их в окне грузануть как выше?

Проверь. Наверное он грузит локальные ссылки, если нет, то нужно сделать локальный сервер)

Этот браузер появился в клиенте с введением исторических боев.

Изменено пользователем ShadowHunterRUS

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах

Т.е. я могу забацать html справочку в пару страничек скажем для своего мода/сборки и локально их в окне грузануть как выше?

По сути без проблем. Тоже в данный момент копаю в эту сторону.

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах
(изменено)

А в бою вызвать такую штуку можно? Flash работает?( Шутка:Ну просто интересует посмотреть кинцо пока кд на арте =))

 

Проверил, в бою не вызывается. Flash работает, (смотрю в ангаре гайды  по арте =D  профильного артовода aBaPu9l_Mo3ra (http://www.koreanrandom.com/forum/topic/24939-%D0%BF%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D0%B0%D1%80%D1%82%D0%BE%D0%B2%D0%BE%D0%B4-%D0%BF%D1%80%D0%B8%D0%B3%D0%BB%D0%B0%D1%88%D0%B0%D0%B5%D1%82-%D0%B8%D0%B3%D1%80%D0%BE%D0%BA%D0%BE%D0%B2-%D0%BD%D0%B0-%D1%81%D0%B2%D0%BE%D0%B9/))

Изменено пользователем BrainRegress
  • Нравится 1

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах
(изменено)

Flash работает?

Это Awesomium) Какой еще флеш) Изменено пользователем ShadowHunterRUS
  • Нравится 1

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах

Это Awesomium) 

А плагины прикрутить можно? AdBlock etc.?

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах
(изменено)
А плагины прикрутить можно? AdBlock etc.?

Обвязка для питона не позволит, если только dll подменить World_of_Tanks\res\awesomium

 

 

смотрю в ангаре гайды  по арте =D  профильного артовода aBaPu9l_Mo3ra
Лучше не надо такое смотреть!

Этот класс ошибка WG)

Изменено пользователем ShadowHunterRUS
  • Нравится 1

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах
(изменено)

 В реплее не работает!

Я в бою проверял(не реплей, не работало по хоткею который (InputHandler.g_instance.onKeyDown += onhandleKeyEvent) ) Может тему профильную запилить по этому game_control.g_instance.browser ?

И там описать принцип работы, применение. (Только я о нем ничего не знаю)

Изменено пользователем BrainRegress

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах

Flash работает, (смотрю в ангаре гайды  по арте =D

Разве это не HTML5?

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах

Разве это не HTML5?

может быть, надо проверить

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах
(изменено)

может быть, надо проверить

Это точно HTML5, я проверил.

 

Т.е. я могу забацать html справочку в пару страничек скажем для своего мода/сборки и локально их в окне грузануть как выше?

@StranikS_Scan, Такие пути отлично работают: file:///C:/Games/World_of_Tanks/res_mods/readme.html

post-16296-0-29116000-1435566122_thumb.jpg

Изменено пользователем ShadowHunterRUS
  • Нравится 1

Поделиться сообщением


Ссылка на сообщение

Короткая ссылка
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×