1. 程式人生 > >python---基礎知識回顧(九)圖形用戶界面

python---基礎知識回顧(九)圖形用戶界面

oot exit root gty 有用 有變 src string tee

主要使用wxPython(最成熟的跨平臺python GUI工具包)

前戲:老牌python GUI程序(Tkinter)

import tkinter.messagebox as messagebox

class Application(Frame):
    def __init__(self,master=None):
        Frame.__init__(self,master,bg="red") #設置框架類的父類(基於master<主窗體>),frame可以是看做控件的父容器
        self.pack() #顯示frame控件
        self.createWidgets()

    def createWidgets(self):    #用於創建控件(是frame的子)
        self.nameInput 
= Entry(self) self.nameInput.pack() self.alertButton = Button(self,text="Hello",command=self.hello) self.alertButton.pack() def hello(self): name = self.nameInput.get() messagebox.showinfo("Message","Hello, %s"%name) root = Tk() root.title("標題") root.wm_minsize(
200,200) app = Application(root) app.mainloop()

技術分享圖片

技術分享圖片
def callback():
    var.set("hhhhhhh")

root = Tk()

var = StringVar()
var.set("66666")


frame1 = Frame(root)
frame2 = Frame(root)


lb = Label(frame1,textvariable=var,padx=20)
lb.pack(side=LEFT)

# img = Image(file="1.gif",imgtype="photo")
img = PhotoImage(file="
1.gif") lb2 = Label(frame1,image=img) lb2.pack(side=RIGHT) btnCm = Button(frame2,text="下一步",command=callback) btnCm.pack() frame1.pack() frame2.pack() root.mainloop()
label標簽的使用(使用圖片) 技術分享圖片
from tkinter import *

root =Tk()

v = IntVar()    #選中為1,未選中為0

c = Checkbutton(root,text="Test",variable=v)
c.pack()

l = Label(root,textvariable=v)
l.pack()

root.mainloop()
Checkbutton使用(1) 技術分享圖片
from tkinter import *

root =Tk()

GIRLS = ["asd",dsa,fef,fwaf]

v = []

def change():
    for i in v:
        print(i.get())

for girl in GIRLS:
    v.append(IntVar())
    b = Checkbutton(root,text=girl,variable=v[-1],command=change)  #使用一個固有變量來記錄狀態
    b.pack(anchor=W)    #控件相對主窗口在左邊


root.mainloop()
Checkbutton的使用(2) 技術分享圖片
#對於單選框,多個按鈕只對應一個變量,復選框,多個按鈕對應多個值
from tkinter import *

def change():
    print(v.get())

root = Tk()

v = IntVar()

Radiobutton(root,text="one",variable=v,value=1,command=change).pack(anchor=W)
Radiobutton(root,text="two",variable=v,value=2,command=change).pack(anchor=W)
Radiobutton(root,text="three",variable=v,value=3,command=change).pack(anchor=W)

root.mainloop()
Radiobutton的使用(1) 技術分享圖片
from tkinter import *

def change():
    print(v.get())


root = Tk()
v = IntVar()

Langes = [
    ("python",1),
    ("javascript",2),
    ("Lua",3),
    ("Ruby",4)
]

for key,val in Langes:
    Radiobutton(root,text=key,variable=v,value=val,command=change).pack(anchor=W)

root.mainloop()
Radiobutton的使用(2)
#對於單選框,多個按鈕只對應一個變量,對於復選框,多個按鈕對應多個值(使用列表獲取)
註意:
root = Tk()
v = IntVar()
這裏我們聲明的變量全部應該寫在主窗口生成後,才可以

不然當我們將變量寫在主窗口生成前
v = IntVar()
root = Tk()
會報錯
AttributeError: NoneType object has no attribute _root
技術分享圖片
1.首先進入IntVar類
class IntVar(Variable):
    def __init__(self, master=None, value=None, name=None):
        Variable.__init__(self, master, value, name)
2.進入父類
class Variable:
    def __init__(self, master=None, value=None, name=None):
        ...
        if not master:    #看此處(master是主窗口,是傳參,但是我們使用的時候並沒有傳入,所以為空,進入下面代碼)
            master = _default_root    #_default_root是什麽
        self._root = master._root()
        self._tk = master.tk
        ...
3._default_root查找
_support_default_root = 1    #也有用,後面看
_default_root = None #是一個全局變量,代表主窗口
但是他也為空,所以出現了上面的屬性錯誤,None沒有_root()方法
------------------------------------------------------------------

開始查看Tk()
root = Tk()
1.查看源碼
class Tk(Misc, Wm):
    def __init__(self, screenName=None, baseName=None, className=Tk,
                 useTk=1, sync=0, use=None):
        ...
        if useTk:    #這裏默認傳入1,進入下面邏輯
            self._loadtk()
       ...
2.查看self._loadtk()方法

    def _loadtk(self):
        self._tkloaded = 1
        global _default_root
        # Version sanity checks
        ......
        # Create and register the tkerror and exit commands
        # We need to inline parts of _register here, _ register
        # would register differently-named commands.
        ......
        if _support_default_root and not _default_root:    #查看上面的全局變量,發現可以進入下面的邏輯代碼中
            _default_root = self    #所以_default_root就是主窗口
        ......
------------------------------------------------------------------

結論:由上面發現可以知道:
IntVar等變量的使用需要_default_root(當我們沒有傳入master時),而主窗口生成root=Tk()時,內部代碼將_default_root實現了。所以兩者順序需要保證先後
原因:源碼分析

還有其他工具包PyQT和PyGTK也是使用十分廣泛的。

python---基礎知識回顧(九)圖形用戶界面