入門八步
========
我們將會使用 專案範例_ 中的 隨機選擇器_ 來作為我們的第一個使用範例。這個隨機選擇器可以讓使用者自訂多個選擇項目,並且從中做出一個隨機的選擇。
.. _專案範例: https://github.com/dokelung/tkouter/tree/master/demo
.. _隨機選擇器: https://github.com/dokelung/tkouter/tree/master/demo/randsel
.. note::
1. 請確定已安裝了相容的 Python 版本、tkouter 和其他相關的套件。
2. 在這份入門指引中我們會使用到三個檔案,分別是描述佈局的 `randsel.html`、`randsel.css` 和元件實作所在的 `randsel.py`。
3. 請將上述三個文件放置在同一個目錄下,如果你並沒有安裝 tkouter,而僅僅只是將之下載下來的話,請一並將 tkouter 套件目錄放置到同一個目錄中。
第一步:使用 html 來佈局視窗程式
--------------------------------
一個基本的 tkouter 元件需要使用一個對應的 html 文件來描述佈局 (layout),下面是初始版本的佈局 html 及其對應的說明與實際視圖:
::
Random Selector
* 如同標準的 html 文件,我們在最外層要使用成對的 ```` 標籤夾住整份文件。
.. note::
```` 下分別有成對的 ```` 標籤和 ```` 標籤,```` 標籤不是每次都會出現的,只有當我們製作的 tkouter 元件是頂層元件時(其 parent 是 ``TK``)才需要這個標籤。
````
用來設定一些 tkouter 的上層資訊,像是視窗名稱、選單資訊等。
````
用來佈局實際使用到的元件。
````
用來設定視窗的名稱。
.. note::
要注意,若這個元件的 parent 不是 ``TK`` 的話,是不允許使用 ```` 的。
````
夾住的元件會由上至下擺置,而 ```` 標籤夾住的元件會由左至右擺置。
.. note::
tkouter 一共提供四種 ``pack`` 用的 **佈局標籤**,分別是 ````, ````, ```` 和 ````,
這四個標籤需要成對出現,會產生 ``Frame`` 元件來佈局其下的元件,我們也可以用 ``type`` 屬性指定其他的 frame 類別,例如此處的 ``LabelFrame``。
````
會產生一個 ``Entry`` 元件,在這個例子中我們用 html 的標籤屬性 ``width="30"`` 來將該元件的長度設定為 30。
``
...
在這裡我們拿掉了 ```` 標籤的長度設定,改為他們增加一個 ``class`` 屬性,值為 ``btn``。
藉由 css 的設定,我們最後也能得到長度為 8 的按鈕。
.. note::
要提醒的是,css 的設定會被 html 中各標籤中直接指明的選項值給覆蓋!
另一種方式是佈局後,再利用元件的 ``config``、``pack`` 等方法來改變設定或佈局,``TkOutWidget`` 有一個方法 ``select`` 可以幫助我們利用 css selector 來找出符合的元件:
::
class RandomSelector(TkOutWidget):
# layout
layout = 'randsel.html'
# model
item = StringField(default='Item Name')
def __init__(self, master):
super().__init__(master)
for w in self.select('.btn'):
w.config(width=8)
self._items = []
...
有了這些機制之後,我們可以很方便地一次性對若干個元件進行設定。
.. note::
tkouter html 佈局中的所有設定都不具備 html 的屬性繼承特性,這受限於不同 tkinter 元件的選項不見得一致。
第八步:tkouter 全域設定
------------------------
我們可以從 tkouter 中匯入 ``settings`` 模組,並且更改其下的全域設定,包含可使用的元件類別等,例如:
::
# randsel.py
...
from tkouter import settings
settings.WIDGETS.update({'my_widget': MY_WIDGET})
...
如此可新增一個全域可用元件 ``MY_WIDGET``,同時給予一個名稱 ``my_widget`` 讓我們可以在 html 佈局中當作標籤名來使用。
下一步?
---------
待續...