python---基础知识回顾(九)图形用户界面,,主要使用wxPyth


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

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

import tkinter.messagebox as messageboxclass 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,未选中为0c = 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---基础知识回顾(九)图形用户界面

评论关闭