tkpf adalah perpustakaan untuk membangun Tkinter GUI dalam paradigma yang dipengaruhi oleh WPF (Windows Presentation Foundation) dan Angular.
Fitur utama adalah:



Anda menentukan GUI dalam format XML atau YAML. Berikut adalah contoh sederhana, 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 > Seperti yang Anda lihat, nama tag XML sesuai dengan nama kelas widget Tkinter, sedangkan atribut XML dengan argumen mereka. tkpf didapat karena selalu menggunakan widget bertema ttk yang lebih baik jika tersedia.
Opsi seperti pack-anchor="nw" atau grid-row="0" Tentukan tata letak dan akan diteruskan ke metode manajer tata letak Tkinter yang sesuai, dalam hal ini .pack(anchor='nw') .
Tentang cara menentukan format GUI dalam YAML, lihat example/ExampleWindow.yaml .
Anda menampilkan GUI dengan membuat kelas yang berasal dari Window dan menunjukkannya. Anda harus menyediakan viewmodel di konstruktor.
class ExampleWindow ( Window ):
template_path = 'ExampleWindow.xml' # 'ExampleWindow.yaml' works too
ExampleWindow ( ExampleModel ()). show ()Jika Anda ingin menyimpan tata letak XML di file ini inline, Anda juga dapat melakukannya:
class ExampleWindow ( Window ):
template = '<Label>Some text</Label>'atau
class ExampleWindow ( Window ):
template_yaml = '''
Label:
text: Some text
'''Mengatur Judul Jendela:
def __init__ ( self , model ):
super (). __init__ ( model )
self . title = 'My application'Di kelas tampilan Anda dapat menulis penangan acara. Buat tombol itu berfungsi sebagai contoh:
def do_stuff ( self ):
self . combobox . config ( state = 'disabled' )Ini juga menunjukkan bagaimana Anda dapat mengakses widget dengan nama dalam metode kelas tampilan. Tetapi jika Anda lebih suka, Anda dapat mengaksesnya secara dinamis seperti ini:
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 mirip dengan properti C# autogenerated. Secara default data tipe adalah str . Anda dapat menyediakan nilai default atau jenis ke konstruktornya.
Bindable adalah dekorator yang dapat Anda gunakan di properti apa pun untuk mengembalikan properti yang dapat diikat. Itu harus mengetahui jenis data dari properti yang dibungkus, jadi harap tentukan jenis pengembaliannya dengan anotasi tipe:
@ Bindable
@ property
def foo () -> int :
return 1 AutoProperty mengurusnya untuk Anda.
Hanya tipe int , bool , float dan str yang didukung untuk binding tkinter, meskipun untuk nilai kombo, Anda dapat menetapkan tuple python.
Jika penangan acara tidak ditemukan di kelas tampilan, itu akan dipandang di viewmodel juga.
Di XML Anda menentukan arah pengikatan data dengan sintaks yang mirip dengan sudut:
values="[available_suboptions]"
adalah ikatan satu arah dari sumber data untuk melihat target,
textvariable="(selected_suboption)"
adalah ikatan satu arah dari target tampilan ke sumber data, dan
variable="[(choice)]"
adalah ikatan dua arah.
Anda dapat menggunakan widget khusus yang berasal dari kelas widget Tkinter. Satu -satunya hal yang harus Anda lakukan adalah menelepon
Directive . Registry . register ( YourCustomWidgetClass )sebelum memuat templat yang menggunakannya.
tkpf mendukung memecah GUI Anda menjadi komponen. Berikut adalah contoh komponen ProgressBar dengan ViewModel sendiri:
class ProgressbarModel ( ViewModel ):
value = BindableProperty ( 0 )
target = BindableProperty ( 100 )
class CustomProgressbar ( Component ):
template = '<Progressbar name="progressbar" variable="[value]" maximum="[target]"/>'Dan Anda dapat menggunakannya seperti ini:
< CustomProgressbar tkpf-model = " [progressbar_model] " /> di mana progressbar_model adalah atribut atau properti pada viewmodel utama Anda.
Pada Python 3.5 Anda harus mendaftarkan komponen Anda sebelum menggunakannya. Pada Python 3.6+ yang otomatis.
Directive . Registry . register ( CustomProgressbar )Direncanakan Anda akan dapat menambahkan ADD custom, atribut yang dapat diikat ke komponen, seperti ini:
class ExampleComponent ( Component ):
template = '<Label name="thelabel">Example component text</Label>'
def config ( self , ** kwargs ):
self . thelabel . config ( text = kwargs [ 'custom-text' ])Dan kemudian gunakan mereka seperti ini:
< ExampleComponent custom-text = " Custom text " />Satu -satunya persyaratan adalah bahwa nama atribut berisi tanda hubung.
tkpf hanya mendukung Python 3.5+.
Ini adalah pekerjaan yang sedang berlangsung. Juga upaya pertama saya untuk membuat perpustakaan. Lihatlah masalah proyek untuk melihat apa yang belum didukung.