最近打算做一个python的音乐播放器,GUI采用python的Tkinter去写(虽然用python去写GUI是很蛋疼的QAQ),但是网上关于Tkinter模块的说明都是英文的,还不如直接去啃python文档中的Tkinter模块部分,于是乎就去啃了TKinter模块的英文文档。。。这里讲讲文档上看到一些姿势。

Setting Options:

当我们创建widget时,如果我们要给widget添加相关的设置,有三种方法添加:

通过constructor来指定option
通过索引来指定option
通过config来指定option

举个栗子:

这三种方法都可以设置
self.button = Tk.Button(bg='blue')  
self.button['bg']='blue'
self.config(bg='blue')

如果我们想要设置某些参数但又不知道怎么设置,我们可以通过config()来打印出设置的参数:

print(self.button.config())

注意!如果是有类似bg这种属性缩写的话,一般是个2-tuple,不然是个5-tuple:(来自python的官方文档)

option name
option name for database lookup
option class for database lookup
default value
current value

Coupling Widget Variables

看到这个的时候,我感觉跟angular的MVVM模式还是挺像的,改变M会在V上反应出来,改变V的值,M的值跟随改变,某些widget(比如Entry widget)的实值可以和应用的variable相互绑定,不过要将variable赋予到widget的指定option上,这样的option包括variable,textvariable,onvalue,offvalue,value,
不过python自身的variable是不支持这种格式的,要用TKinter的Variable Class及其子类产生的变量才能采用,比如StringVar,IntVar,DoubleVar或是BoolVar,这种形式的变量可以用get()和set()方法来获取和设定自身的值。
这里依旧给出文档的例子:

class App(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()

        self.entrythingy = Entry()
        self.entrythingy.pack()

        # 我们在这里创建了Variable Class 变量
        self.contents = StringVar()
        # 通过set()方法设定实值
        self.contents.set("this is a variable")
        # 将widget和Variable进行绑定
        self.entrythingy["textvariable"] = self.contents

        # 在这里我们进行了事件绑定
        # <Key-Return>表示用户每次按回车键的事件
        # 触发该事件时调用print_contents打印出Variable
        # 的值,同时观察是否Variable和widget进行了绑定
        self.entrythingy.bind('<Key-Return>',
                          self.print_contents)

    def print_contents(self, event):
        print("hi. contents of entry is now ---->",
              self.contents.get())

运行上述程序会发现,当我们将Entry的值修改了以后,按下回车,会打印出我们修改的值(self.contents.get()),说明widget的实值已经和Variable进行了绑定。

Bindings and Events

说起GUI界面,一定会有用户事件机制,TKinter中,采用bind()方法将widget和对应的事件类型绑定在一起,形成对widget事件的监听,bind方法的定义如下:

def bind(self, sequence, func, add=''):

sequence表示事件类型,事件类型的话可以参考这个文档

func表示对应的事件处理函数,当事件触发时调用这个函数

add在bind中要默认值’’,实际上add可取的值有’’和’+’,当add取’’的时候,对同个widget触发的同个类型的事件只能调用一个事件处理函数,
比如:

self.button.bind('<Enter>',fn1)
self.button.bind('<Enter>',fn2)

这个时候触发事件只会调用fn2而不会两个都调用,当add取’+’的时候,则事件可以绑定多个监听器,即可以同时触发

就讲这么多了,python文档的内容只是做了个概述而没有详细地去讲,想要了解更多的同学可以去这里或是去看比较完整的文档