tkpf - это библиотека для строительства GUI TKINTER в парадигме под влиянием WPF (Foundation Windows Presentation Foundation) и Angular.
Основные особенности:



Вы указываете графический интерфейс в формате XML или YAML. Вот простой пример, ExampleWindow.xml :
< Frame pack-anchor = " nw " pack-padx = " 5 " >
< LabelFrame text = " Options " pack-anchor = " w " pack-fill = " x " >
< Radiobutton pack-anchor = " w " variable = " [(choice)] " value = " option1 " >
Option 1
</ Radiobutton >
< Radiobutton pack-anchor = " w " variable = " [(choice)] " value = " option2 " >
Option 2
</ Radiobutton >
< Combobox pack-anchor = " w " textvariable = " (selected_suboption) " values = " [available_suboptions] "
name = " combobox " />
< Button command = " do_stuff " >Do stuff</ Button >
</ LabelFrame >
</ Frame > Как вы можете видеть, имена тегов XML соответствуют именам классов класса виджетов Tkinter, а XML атрибуты их аргументам. tkpf самоуправляется тем, что он всегда использует более выглядящие виджеты ttk Themed, когда это возможно.
Такие параметры, как pack-anchor="nw" или grid-row="0" указывают макет и будут переданы соответствующему методу Mayout Mayout Tkkinter, в данном случае .pack(anchor='nw') .
О том, как указать графический интерфейс в формате YAML, см. example/ExampleWindow.yaml .
Вы отображаете графический интерфейс, создав класс, полученный из Window , и показывая его. Вы должны предоставить ViewModel в конструкторе.
class ExampleWindow ( Window ):
template_path = 'ExampleWindow.xml' # 'ExampleWindow.yaml' works too
ExampleWindow ( ExampleModel ()). show ()Если вы хотите сохранить макет XML в этом файле встроенным, вы тоже можете это сделать:
class ExampleWindow ( Window ):
template = '<Label>Some text</Label>'или
class ExampleWindow ( Window ):
template_yaml = '''
Label:
text: Some text
'''Установка заголовка окна:
def __init__ ( self , model ):
super (). __init__ ( model )
self . title = 'My application'В классе View вы можете написать обработчики событий. Заставить эту кнопку работать, например:
def do_stuff ( self ):
self . combobox . config ( state = 'disabled' )Это также показывает, как вы можете получить доступ к виджетам по имени в методах класса View. Но если вы предпочитаете, вы можете получить доступ к ним динамически так:
self . named_widgets [ 'combobox' ] class ExampleModel ( ViewModel ):
choice = Bindable ( AutoProperty ( 1 ))
available_suboptions = Bindable ( AutoProperty ())
selected_suboption = Bindable ( AutoProperty ())
def __init__ ( self ):
super (). __init__ ()
self . available_suboptions = ( 'suboption1' , 'suboption2' ) AutoProperty аналогична автогенерируемому свойству C#. По умолчанию его дат данных str . Вы можете предоставить либо значение по умолчанию, либо тип его конструктору.
Bindable - это декоратор, который вы можете использовать на любом свойстве для возврата связуемого свойства. Он должен знать тип данных обернутого свойства, поэтому укажите его тип возврата с помощью аннотации типа:
@ Bindable
@ property
def foo () -> int :
return 1 AutoProperty позаботится об этом для вас.
Только типы int , bool , float и str поддерживаются для привязки TKINTER, хотя для значений ComboBox вы можете назначить кортеж для Python.
Если обработчик событий не найден на классе View, он также будет рассмотрен на ViewModel.
В XML вы указываете направление связывания данных с помощью синтаксиса, аналогичного направлению Angular:
values="[available_suboptions]"
одностороннее привязка из источника данных для просмотра цели,
textvariable="(selected_suboption)"
является односторонним привязкой от целевого показателя к источнику данных, и
variable="[(choice)]"
это двустороннее переплет.
Вы можете использовать пользовательские виджеты, полученные из классов виджетов Tkinter. Единственное, что вам нужно сделать, это позвонить
Directive . Registry . register ( YourCustomWidgetClass )Перед загрузкой шаблона, который его использует.
tkpf поддерживает разбивание вашего графического интерфейса на компоненты. Вот пример компонента ProgressBar с собственной ViewModel:
class ProgressbarModel ( ViewModel ):
value = BindableProperty ( 0 )
target = BindableProperty ( 100 )
class CustomProgressbar ( Component ):
template = '<Progressbar name="progressbar" variable="[value]" maximum="[target]"/>'И вы можете использовать это так:
< CustomProgressbar tkpf-model = " [progressbar_model] " /> где progressbar_model является атрибутом или свойством на вашем основном просмотре.
На Python 3.5 вы должны зарегистрировать свой компонент перед его использованием. На Python 3.6+, который является автоматическим.
Directive . Registry . register ( CustomProgressbar )Планируется, что вы сможете добавить настраиваемые атрибуты, связанные с компонентами, например:
class ExampleComponent ( Component ):
template = '<Label name="thelabel">Example component text</Label>'
def config ( self , ** kwargs ):
self . thelabel . config ( text = kwargs [ 'custom-text' ])а затем используйте их так:
< ExampleComponent custom-text = " Custom text " />Единственное требование состоит в том, что имя атрибута содержит дефис.
tkpf поддерживает только Python 3.5+.
Это работа в процессе. Также моя первая попытка создать библиотеку. Посмотрите на проблемы проекта, чтобы увидеть, что еще не поддерживается.