python---基础知识回顾(九)图形用户界面

主要使用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也是使用十分广泛的。

猜你喜欢

转载自www.cnblogs.com/ssyfj/p/8971750.html