Jump to content
Korean Random
SV_Kirov

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

Recommended Posts

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

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

Edited by SV_Kirov

Share this post


Link to post

Short link
Share on other sites

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

Здесь нужен 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:

Edited by ShadowHunterRUS
  • Upvote 13

Share this post


Link to post

Short link
Share on other sites

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

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

Edited by SV_Kirov

Share this post


Link to post

Short link
Share on other sites

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

 

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

  • Upvote 3

Share this post


Link to post

Short link
Share on other sites

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

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

Share this post


Link to post

Short link
Share on other sites

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

Edited by ShadowHunterRUS
  • Upvote 10
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

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

 

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

Share this post


Link to post

Short link
Share on other sites

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

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

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

Edited by ShadowHunterRUS

Share this post


Link to post

Short link
Share on other sites

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

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

Share this post


Link to post

Short link
Share on other sites

А в бою вызвать такую штуку можно? 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/))

Edited by BrainRegress
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
А плагины прикрутить можно? AdBlock etc.?

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

 

 

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

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

Edited by ShadowHunterRUS
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

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

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

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

Edited by BrainRegress

Share this post


Link to post

Short link
Share on other sites

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

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

 

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

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

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

Edited by ShadowHunterRUS
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...