tkpf هي مكتبة لبناء GUIs tkinter في نموذج يتأثر WPF (Foundation Windows Presentation) و 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 بشكل أفضل عند توفرها.
تحدد خيارات مثل pack-anchor="nw" أو grid-row="0" التخطيط وسيتم تمريرها إلى طريقة مدير تخطيط Tkinter المناسبة ، في هذه الحالة .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'في فئة العرض ، يمكنك كتابة معالجات الأحداث. اجعل هذا الزر يعمل على سبيل المثال:
def do_stuff ( self ):
self . combobox . config ( state = 'disabled' )يوضح هذا أيضًا كيف يمكنك الوصول إلى الحاجيات بالاسم في طرق فئة العرض. ولكن إذا كنت تفضل ، يمكنك الوصول إليها بشكل ديناميكي مثل هذا:
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# C#. افتراضيا نوع البيانات هو str . يمكنك توفير قيمة افتراضية أو نوع إلى مُنشئه.
Bindable هو ديكور يمكنك استخدامه على أي خاصية لإرجاع خاصية قابلة للربط. يجب أن تعرف نوع البيانات الخاص بالخاصية ملفوفة ، لذا يرجى تحديد نوع الإرجاع الخاص به باستخدام التعليق التوضيحي النوع:
@ Bindable
@ property
def foo () -> int :
return 1 AutoProperty يعتني بذلك من أجلك.
يتم دعم أنواع int و bool و float و str فقط لربط tkinter ، على الرغم من قيم combobox ، يمكنك تعيين tuple python.
إذا لم يتم العثور على معالج الأحداث في فئة العرض ، فسيتم البحث عنه على ViewModel أيضًا.
في XML ، تحدد اتجاه ربط البيانات بخصوصية مماثلة لتلك الزاوية:
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 هو سمة أو خاصية على Main ViewModel.
على 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+.
هذا عمل مستمر. أيضا محاولتي الأولى لإنشاء مكتبة. انظر إلى قضايا المشروع لمعرفة ما لم يتم دعمه بعد.