SV_Kirov 1 Posted June 28, 2015 (edited) Доброе время суток, прошу помощи. Подскажите как на питоне создать форму(окно) в ангаре. Например как в моде протанков(оповещение о выходе новой версии модов). Буду очень благодарен. Сразу скажу, что за питон взялся неделю назад. Сам программирую в delphi и C# Edited June 28, 2015 by SV_Kirov Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #279913 Posted June 28, 2015 (edited) On 6/28/2015 at 4:48 PM, SV_Kirov said: как на питоне создать форму(окно) Здесь нужен Flash. Из питона можно вызвать swf. mod_TestWindow.py from frameworks.wulf import WindowLayer from gui.Scaleform.framework import g_entitiesFactories, ViewSettings, ScopeTemplates from gui.Scaleform.framework.entities.abstract.AbstractWindowView import AbstractWindowView from gui.Scaleform.framework.managers.loaders import SFViewLoadParams from helpers import dependency from skeletons.gui.app_loader import IAppLoader from gui.shared.utils.key_mapping import getBigworldNameFromKey from gui import InputHandler 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' _layer = WindowLayer.WINDOW _event = None _scope = ScopeTemplates.VIEW_SCOPE _settings = ViewSettings(_alias, TestWindow, _url, _layer, _event, _scope) g_entitiesFactories.addSettings(_settings) def onhandleKeyEvent(event): key = getBigworldNameFromKey(event.key) if key == 'KEY_F10': appLoader = dependency.instance(IAppLoader) app = appLoader.getApp() app.loadView(SFViewLoadParams(_alias)) 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 Настройки проекта: И не забываем подключить внешнюю библиотеку res\packages\gui-part1.pkg\gui\flash\swc\lobby.swc Project-> Properties-> Compiler Options-> External Libraries Собираем TestWindow.swf и кладем в res_mods\<wot_ver>\gui\flash\ Нажимаем F10. Результат: Теперь добавим 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; } } } Также можно использовать диалоги подтверждения. 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 Можно еще посмотреть видеогайд от WG: Edited July 4, 2021 by SkepticalFox 15 Quote Share this post Link to post Short link Share on other sites
SV_Kirov 1 #279915 Posted June 28, 2015 (edited) Хм.. Тогда я не совсем понимаю как работает WoT Versus, насколько я смотрю там нет ни одного swf файла, но при это при нажатии на f10 показывает форму с информацией. Edited June 28, 2015 by SV_Kirov Quote Share this post Link to post Short link Share on other sites
BossBox 14 #279916 Posted June 28, 2015 Хм.. Тогда я не совсем понимаю как работает WoT Versus, насколько я смотрю там нет ни одного swf файла, но при это при нажатии на f10 показывает форму с информацией. Это окно веб-страницы с использованием Awesomium. 3 Quote Share this post Link to post Short link Share on other sites
SV_Kirov 1 #279917 Posted June 28, 2015 Это окно веб-страницы с использованием Awesomium. Тогда собственно логичный вопрос, как его можно заюзать? Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #279921 Posted June 28, 2015 (edited) 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 Передача данных из 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> Увидим в логе:... 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> Обработка питоном переходов по 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> Edited November 11, 2015 by ShadowHunterRUS 10 1 Quote Share this post Link to post Short link Share on other sites
SV_Kirov 1 #279927 Posted June 28, 2015 Спасибо Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #279928 Posted June 28, 2015 (edited) Спасибо Если что-то ещё нужно - обращайся Edited June 28, 2015 by ShadowHunterRUS 2 Quote Share this post Link to post Short link Share on other sites
SV_Kirov 1 #279929 Posted June 28, 2015 Если что-то ещё нужно - обращайся Хорошо Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #279941 Posted June 28, 2015 Если что-то ещё нужно - обращайся Т.е. я могу забацать html справочку в пару страничек скажем для своего мода/сборки и локально их в окне грузануть как выше? Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #279943 Posted June 28, 2015 (edited) Т.е. я могу забацать html справочку в пару страничек скажем для своего мода/сборки и локально их в окне грузануть как выше?Проверь. Наверное он грузит локальные ссылки, если нет, то нужно сделать локальный сервер) Этот браузер появился в клиенте с введением исторических боев. Edited June 28, 2015 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
SV_Kirov 1 #279952 Posted June 28, 2015 Т.е. я могу забацать html справочку в пару страничек скажем для своего мода/сборки и локально их в окне грузануть как выше? По сути без проблем. Тоже в данный момент копаю в эту сторону. Quote Share this post Link to post Short link Share on other sites
PinkElfant 25 #279960 Posted June 28, 2015 (edited) А в бою вызвать такую штуку можно? 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 June 28, 2015 by BrainRegress 1 Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #279968 Posted June 28, 2015 (edited) Flash работает?Это Awesomium) Какой еще флеш) Edited November 11, 2015 by ShadowHunterRUS 1 Quote Share this post Link to post Short link Share on other sites
PinkElfant 25 #279969 Posted June 28, 2015 Это Awesomium) А плагины прикрутить можно? AdBlock etc.? Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #279970 Posted June 28, 2015 (edited) . Edited July 4, 2021 by SkepticalFox 1 Quote Share this post Link to post Short link Share on other sites
PinkElfant 25 #279976 Posted June 28, 2015 (edited) В реплее не работает! Я в бою проверял(не реплей, не работало по хоткею который (InputHandler.g_instance.onKeyDown += onhandleKeyEvent) ) Может тему профильную запилить по этому game_control.g_instance.browser ? И там описать принцип работы, применение. (Только я о нем ничего не знаю) Edited June 28, 2015 by BrainRegress Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #279977 Posted June 28, 2015 Flash работает, (смотрю в ангаре гайды по арте =DРазве это не HTML5? Quote Share this post Link to post Short link Share on other sites
PinkElfant 25 #279978 Posted June 28, 2015 Разве это не HTML5? может быть, надо проверить Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #280015 Posted June 29, 2015 (edited) может быть, надо проверитьЭто точно HTML5, я проверил. Т.е. я могу забацать html справочку в пару страничек скажем для своего мода/сборки и локально их в окне грузануть как выше? @StranikS_Scan, Такие пути отлично работают: file:///C:/Games/World_of_Tanks/res_mods/readme.html Edited November 11, 2015 by ShadowHunterRUS 1 Quote Share this post Link to post Short link Share on other sites