Разработка кроссплатформенных графических интерфейсов с IronPython: wx.NET для истинного естественного внешнего вида - PullRequest
1 голос
/ 07 января 2011

Очевидно, что с IronPython можно создать первоклассный пользовательский интерфейс, написав разные уровни графического интерфейса для каждой платформы (GTK # в Linux, WinForms в Windows ...)

Я серьезно рассматриваюделаю это, хотя маленький учёный в моей голове кричит.Одним из способов избежать такого дублирования было бы использование набора инструментов wxWidgets, который способен обеспечить действительно естественный внешний вид на нескольких платформах.Поскольку я планирую использовать IronPython, я предполагаю, что это будет связано с использованием оболочки wx.NET.

У меня такой вопрос: возможно ли использовать оболочку wx.NET в IronPython?Что еще более важно: ЛЕГКО ли использовать wx.NET в IronPython?Я искал вокруг, и не нашел много доказательств людей, использующих эту комбинацию в другом месте.Кто-нибудь использовал эти две технологии вместе или слышал о проекте, который это делает?

Спасибо!

1 Ответ

3 голосов
/ 12 января 2011

Я провел некоторое время, играя с IronPython и библиотекой wx.NET, и обнаружил, что можно использовать wx.NET из IronPython.Я создал небольшой пример приложения, демонстрирующий основную идею (протестирован с Mono 2.8.1 и IronPython 2.6.1 в Linux).Файл XRC был создан с использованием wxFormBuilder.Кажется, что было бы довольно легко создать графический интерфейс wx.NET с использованием IronPython;выглядит примерно так же, как эквивалентный код C #.

hello_frame.pyw:

import clr
clr.AddReference("wx.NET.dll")
from wx import *

class MyFrame1(Frame):
    def __init__(self):
        XmlResource.Get().LoadFrame(self, None, "MyFrame1")
        self.EVT_BUTTON( XmlResource.XRCID("m_button1"), EventListener(self.OnMyButtonClicked) )
    def OnMyButtonClicked(self, sender, e):
        MessageDialog.ShowModal( self, "HELLO WORLD!", "", WindowStyles.DIALOG_OK | WindowStyles.ICON_INFORMATION )
class HelloWorldDemo(App):
    def OnInit(self):
        XmlResource.Get().InitAllHandlers()
        XmlResource.Get().Load( "hello_frame.xrc" )
        f = MyFrame1()
        f.Show()
        return True
def main():
    app = HelloWorldDemo()
    app.Run()
if __name__ == '__main__':
    main()

hello_frame.xrc:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<resource xmlns="http://www.wxwindows.org/wxxrc" version="2.3.0.1">
    <object class="wxFrame" name="MyFrame1">
        <style>wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL</style>
        <size>500,300</size>
        <title>Demo</title>
        <centered>1</centered>
        <object class="wxBoxSizer">
            <orient>wxVERTICAL</orient>
            <object class="sizeritem">
                <option>0</option>
                <flag>wxALL</flag>
                <border>5</border>
                <object class="wxStaticText" name="m_staticText1">
                    <label>My Super Program</label>
                    <wrap>-1</wrap>
                </object>
            </object>
            <object class="sizeritem">
                <option>0</option>
                <flag>wxALL</flag>
                <border>5</border>
                <object class="wxTextCtrl" name="m_textCtrl1">
                    <value></value>
                    <maxlength>0</maxlength>
                </object>
            </object>
            <object class="sizeritem">
                <option>0</option>
                <flag>wxALL</flag>
                <border>5</border>
                <object class="wxButton" name="m_button1">
                    <label>Press Me!</label>
                    <default>0</default>
                </object>
            </object>
        </object>
    </object>
</resource>
...