python---基礎知識回顧(九)圖形用戶界面
阿新 • • 發佈:2018-04-29
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="label標簽的使用(使用圖片)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()
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---基礎知識回顧(九)圖形用戶界面