SV_Kirov Posted June 28, 2015 Share Posted June 28, 2015 (edited) Доброе время суток, прошу помощи. Подскажите как на питоне создать форму(окно) в ангаре. Например как в моде протанков(оповещение о выходе новой версии модов). Буду очень благодарен. Сразу скажу, что за питон взялся неделю назад. Сам программирую в delphi и C# Edited June 28, 2015 by SV_Kirov @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted June 28, 2015 Share 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 Link to comment Short link Share on other sites More sharing options...
SV_Kirov Posted June 28, 2015 Author Share Posted June 28, 2015 (edited) Хм.. Тогда я не совсем понимаю как работает WoT Versus, насколько я смотрю там нет ни одного swf файла, но при это при нажатии на f10 показывает форму с информацией. Edited June 28, 2015 by SV_Kirov @ Quote Link to comment Short link Share on other sites More sharing options...
BossBox Posted June 28, 2015 Share Posted June 28, 2015 Хм.. Тогда я не совсем понимаю как работает WoT Versus, насколько я смотрю там нет ни одного swf файла, но при это при нажатии на f10 показывает форму с информацией. Это окно веб-страницы с использованием Awesomium. 3 @ Quote Link to comment Short link Share on other sites More sharing options...
SV_Kirov Posted June 28, 2015 Author Share Posted June 28, 2015 Это окно веб-страницы с использованием Awesomium. Тогда собственно логичный вопрос, как его можно заюзать? @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted June 28, 2015 Share 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 Link to comment Short link Share on other sites More sharing options...
SV_Kirov Posted June 28, 2015 Author Share Posted June 28, 2015 Спасибо @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted June 28, 2015 Share Posted June 28, 2015 (edited) Спасибо Если что-то ещё нужно - обращайся Edited June 28, 2015 by ShadowHunterRUS 2 @ Quote Link to comment Short link Share on other sites More sharing options...
SV_Kirov Posted June 28, 2015 Author Share Posted June 28, 2015 Если что-то ещё нужно - обращайся Хорошо @ Quote Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted June 28, 2015 Share Posted June 28, 2015 Если что-то ещё нужно - обращайся Т.е. я могу забацать html справочку в пару страничек скажем для своего мода/сборки и локально их в окне грузануть как выше? @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted June 28, 2015 Share Posted June 28, 2015 (edited) Т.е. я могу забацать html справочку в пару страничек скажем для своего мода/сборки и локально их в окне грузануть как выше?Проверь. Наверное он грузит локальные ссылки, если нет, то нужно сделать локальный сервер) Этот браузер появился в клиенте с введением исторических боев. Edited June 28, 2015 by ShadowHunterRUS @ Quote Link to comment Short link Share on other sites More sharing options...
SV_Kirov Posted June 28, 2015 Author Share Posted June 28, 2015 Т.е. я могу забацать html справочку в пару страничек скажем для своего мода/сборки и локально их в окне грузануть как выше? По сути без проблем. Тоже в данный момент копаю в эту сторону. @ Quote Link to comment Short link Share on other sites More sharing options...
PinkElfant Posted June 28, 2015 Share 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 Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted June 28, 2015 Share Posted June 28, 2015 (edited) Flash работает?Это Awesomium) Какой еще флеш) Edited November 11, 2015 by ShadowHunterRUS 1 @ Quote Link to comment Short link Share on other sites More sharing options...
PinkElfant Posted June 28, 2015 Share Posted June 28, 2015 Это Awesomium) А плагины прикрутить можно? AdBlock etc.? @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted June 28, 2015 Share Posted June 28, 2015 (edited) . Edited July 4, 2021 by SkepticalFox 1 @ Quote Link to comment Short link Share on other sites More sharing options...
PinkElfant Posted June 28, 2015 Share Posted June 28, 2015 (edited) В реплее не работает! Я в бою проверял(не реплей, не работало по хоткею который (InputHandler.g_instance.onKeyDown += onhandleKeyEvent) ) Может тему профильную запилить по этому game_control.g_instance.browser ? И там описать принцип работы, применение. (Только я о нем ничего не знаю) Edited June 28, 2015 by BrainRegress @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted June 28, 2015 Share Posted June 28, 2015 Flash работает, (смотрю в ангаре гайды по арте =DРазве это не HTML5? @ Quote Link to comment Short link Share on other sites More sharing options...
PinkElfant Posted June 28, 2015 Share Posted June 28, 2015 Разве это не HTML5? может быть, надо проверить @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted June 29, 2015 Share 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 Link to comment Short link Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.