核心
====
要使用 tkouter,我們通常都會從 tkouter 中匯入所有的元件:
::
from tkouter import *
當然我們也可以只匯入需要用的部分,例如:
::
from tkouter import TkOutWidget
繼承 TkOutWidget 來實作自訂元件
-------------------------------
``tkouter.core.TkOutWidget`` 是 tkouter 最核心的 class,我們實作的元件都必需繼承自該類別。
一個最基本的 ``TkOutWidget`` 可能長成下面這個樣子:
::
class HelloWorld(TkOutWidget):
layout = """
hello world
"""
def hello(self):
messagebox.showinfo('welcome to tkouter', 'hello world')
我們透過設定類別變數 ``layout``,來給予該元件一個 html 佈局,tkouter 會自動根據該 html 來生成相應的佈局。
我們也可以將這段 html 放到一個單獨的文件 ``hw.html`` 裡面,然後改成指定文件名的方式來讓 tkouter 找到 html 佈局:
::
class HelloWorld(TkOutWidget):
layout = "hw.html"
def hello(self):
messagebox.showinfo('welcome to tkouter', 'hello world')
寫完了 ``TkOutWidget`` 類別之後,我們只要將之實例化,便能將該元件生出來並且做好佈局,最後呼叫 tkinter root 的 mainloop 來啟動 GUI 應用。
>>> from tkinter import Tk
>>> root = Tk()
>>> hw = HelloWorld(root)
>>> hw.pack()
>>> root.mainloop()
下面簡列該類別中,五個可設定的 class variable,我們將在各個章節介紹他們:
============= =========
name 說明
============= =========
widgets 這是一個 dictionay,key 是可使用的標籤名,value 是該標籤對應生成的 tk 元件。
loader html 佈局和 css 等靜態文件的載入器,使用者可以將之設定為任何一個可用的 Jinja2 載入器。
layout 描述佈局的 **html 字串** 或是 **html 文件名稱**,目前僅支援 ``.html`` 和 ``.xml`` 兩種文件類型。
context 這是一個 dictionay,用來進行 html 佈局的 **渲染 (render)**。
data_context 這是一個 dictionay,用來進行 html 佈局的 **綁定 (bind)**。
============= =========
接下來,我們會陸續介紹 tkouter 如何實現佈局的,同時也會指出一些設定上要注意的事項。
原理
----
整個佈局的原理是這樣子的:
1. ``TkOutWidget`` 本身是 ``Frame`` 元件的子類別,當我們實體化一個 ``TkOutWidget`` 物件的時候,我們會生成一個 ``Frame`` 元件。而在 ```` 標籤其下的元件會 pack 或 grid 到這個 ``Frame`` 底下。
2. ````、```` 和 ```` 標籤不會做任何事情,他們只是用來界定範圍用的。
3. ```` 標籤底下的內容都是用來設置頂層資訊或菜單的,詳見之後的介紹。
4. ```` 標籤底下只允許元件標籤和佈局標籤的存在,tkouter 首先根據元件標籤產生對應的 tk 元件並將之賦值給對應的變數,再根據佈局標籤,呼叫對應的 ``pack`` 和 ``grid`` 方法來做佈局。
.. note::
元件在生成的時候會以其上層標籤對應的元件為 parent (master),而 TkOutWidget 元件本身的 parent 在其被實例化時指定。
標籤
----
接著我們來談佈局上的標籤。
標籤的結構與屬性
~~~~~~~~~~~~~~~~
由於 tkouter 的核心引擎是一個 XML parser,所以能夠使用的標籤只有:
1. 成對出現的 start tag 和 end tag,前者如 ````,後者如 ````。
2. 單獨出現的 startend tag,也就是所謂的封閉標籤,如 ````。
而有些標籤只能以成對的方式出現,例如 ```` 或 ````,而大部分的元件標籤都可以自由選擇使用成對標籤或封閉標籤。
一個 **完整的** 標籤,可能長這樣:
::
如同標準的 html,一個 tkouter 標籤具有下列成分:
**標籤名稱**
在標籤最一開頭的單一字串,標籤名稱必須是 tkouter 預設支援的標籤或是使用者自行註冊的元件標籤。
**標籤屬性**
以 ``屬性名="屬性值"`` 的形式出現,各屬性間由 *空白* 隔開。
其中 ``class`` 和 ``id`` 屬性是所有標籤皆可設定的屬性,其作用是能讓我們使用 CSS selector 去選取元件。
而名稱中有 ``-`` 字元的屬性我們稱為 **特殊屬性** 或 **元件方法屬性**,我們會在 `元件標籤 <元件標籤_>`_ 中介紹到。
**標籤內文**
夾在成對標籤中的純文字。
對於元件標籤而言,標籤內文會成為其 ``text`` 屬性的值,而對於菜單標籤而言,該文字會成為 ``label`` 屬性的值。
也就是說 ```` 基本上等價於 ````。
.. note::
除了標籤名稱之外,其他的屬性幾乎都是可選的。如果使用預設值就能滿足我們需求的話,我們應當盡可能減少不必要的屬性設定。
標籤的種類
~~~~~~~~~~
在 tkouter 的 html 佈局中,標籤分為下面幾類:
============= =========
種類 說明
============= =========
文件標籤 就是 ```` 標籤,用以定義整個佈局的範圍。
範圍標籤 分別是 ```` 和 ```` 標籤,前者用來作一些 top level 的設定,後者用來佈局實體元件。
頂層資訊標籤 用來設定頂層視窗的標籤,如設定視窗標題的 ```` 標籤和設定視窗大小的 ```` 標籤。
佈局標籤 用來配合 ``pack`` 和 ``grid`` 方法的佈局標籤。
菜單標籤 用來進行菜單的設置的標籤,例如:``