python图形界面设计

1.根窗体

        (1)创建根窗体对象

        ①tkinter.Tk():创建一个根窗体对象。使用后会立即显示窗口,别忘记用root接收。

        ②root.title(name):设置根窗体的标题。

        ③root.geometry('aaaxbbb'):设置根窗体的尺寸。注意这里的乘号是小写字母x,aaa为宽,bbb为高。

        ④root.mainloop():监听上方代码,封锁下方代码,直到窗口被关闭。

import tkinter

root = tkinter.Tk()
root.title('myapp')    #不要写成root.title='myapp',这与c++窗体不同
root.geometry('500x300')
root.mainloop()

        (2)控件布局

        .pack()方法(用Label举例)

        ①tkinter.Label(root,..,text,fg,relief):创建一个标签对象。其中,root是根窗体;text是标签文本;fg是标签颜色,各种颜色用英文表示;relief是标签边缘属性,relief=tkinter.GROOVE为边缘凹陷属性。注意Label中L为大写。

        ②label.pack():将label放置在根窗体上。放置的规则为:如果不加参数的默认方式,将以不重叠且紧挨着的形式从上往下纵向排列,水平位置居中。

        ③label.pack()可设置fill和side等参数。其中,参数fill 可取值:fill=X,fill=Y或fill=BOTH,分别表示允许控件向水平方向、垂直方向或二维方向将剩余空间填充满。参数 side 可取值:side=TOP(默认),side=LEFT,side=RIGHT,side=BOTTOM,分别表示本控件实例的布局相对于下一个控件实例的方位。

import tkinter

root=tkinter.Tk()
lbred=tkinter.Label(root,text='red',fg='red',relief=tkinter.GROOVE)
lbred.pack()
lbgreen=tkinter.Label(root,text='绿',fg='green',relief=tkinter.GROOVE)
lbgreen.pack(side=tkinter.LEFT)
lbblue=tkinter.Label(root,text='blue',fg='blue',relief=tkinter.GROOVE)
lbblue.pack(fill=tkinter.BOTH)
root.mainloop()

         .grid()方法

        基于表格布局,在相应表格中放置放置控件。其中一些参数意义如下:
        ①column,row:控件的行、列坐标,默认为0(注意坐标从0开始)。

        ②columnspan,rowspan:控件跨越的行数、列数,默认为1

        ③ipadx,ipady:实例控件所呈现区域内的像素数,定义控件的大小。

        ④padx,pady:实例控件所在单元格的大小,定义单元格的大小。

        .place()方法

        根据空间在父容器中的相对位置进行布局:

        ①x,y:控件相对于根窗体下的坐标。

        ②relx,rely:控件相对与根窗体下的相对位置。

        ③height和width:控件的高度和宽度。(单位为像素)。

        ④relheight和relwidth:控件相对于根窗体的相对高度和宽度。

注:可以和grid()方法混合使用

import tkinter

root = tkinter.Tk()
root.title('myapp')    #不要写成root.title='myapp',这与c++窗体不同
root.geometry('500x300')
msg1=tkinter.Message(root,text='我是一行文字我是另一行文字',relief=tkinter.GROOVE)
msg1.place(relx=0.2,rely=0.4,relwidth=0.6,relheight=0.4)
root.mainloop()

2.常见控件

        (1)常用控件简介

                常用空间如下:

控件 名称 作用
Button 按钮 单击触发事件
Canvas 画布 绘制图形或绘制特殊控件
Checkbutton 复选框 多项选择
Entry 输入框 接收单行文本输入
Frame 框架 用于控件分组
Label 标签 单行文本显示
Listbox 列表框 显示文本列表
Menu       菜单 创建菜单命令
Message 消息 多行文本标签,与Label 用法类似
Radiobutton 单选框 从互斥的多个选项中做单项选择
Scale 滑块  鼠标拖动数值变化
Scrollbar 滑动条 即滚动条
Text 文本框 接受或输出显示多行文本
Toplevel 新建窗体容器 在顶层新建窗体容器

                 控件共同属性:

属性  说明 取值
anchor 文本的起始位置 CENTER(默认),E,S,W,N,NE,SE,SW,NW
bg 背景色 'red','green'等
bd 加粗
cursor 鼠标悬停光标 -
font 字体 例如:('华文新魏',32)
fg         前景色 'red','green'等
height 高(文本控件单位为行,不是像素) 数字
image 显示图像
justify 多行文本对齐方式 CENTER(默认),LEFT,RIGHT,TOP,BOTTOM
padx 水平扩展像素
pady 垂直扩展像素
relief 边界样式 FLAT,RAISED,SUNKEN,GROOVE,RIDGE
state 控件实例状态是否可用 NORMAL(默认),DISABLED
width 宽(文本控件的单位为行,不是像素)
from tkinter import *
root=Tk()
lb = Label(root,text='hello world!',\
        bg='#00ffff',\
        fg='green',\
        font=('微软雅新',32),\
        relief=GROOVE,\
        width=20,\
        height=2)
lb.pack()
root.mainloop()

注:width和height单位为列或行,这是因为用pack()或grid()放置时按表格的单位给出。若用place()放置,可以在place参数中设置其控件大小,此时单位为像素。

        (2)文本输入和输出相关控件

        .标签(Label)和消息(Message):Label显示单行文本,Message显示多行文本。其余属性基本一致。

        text属性只能用于第一次呈现时的固定文本。若需文本变更,有以下两种方法:

        ①用configure()方法改变text的值;

        ②定义tkinter的内部类型变量var=StringVar(),改变其值也可使文本发生变化。

        方法一:用configure()方法改变text的值

from tkinter import *
import time

root=Tk()
root.geometry('500x300')

def gettime():
        nowtime=time.strftime("%H:%M:%S")
        lb.config(text=nowtime)
        root.after(1000,gettime) #1000ms后调用gettime()函数

if __name__=='__main__':
        root.title('time')
        lb=Label(root,text='',fg='red',font=('微软雅新',80))
        lb.pack()
        gettime()
        root.mainloop()

注:样例中用了config(),实际上configure()有同样作用。关于它们的差别,在使用中没有找出差别,网上资料查找也无果。

          方法二:利用textvariable变量属性来实现文本变化。

        

from tkinter import *
import time
root=Tk()
root.geometry('500x300')

def gettime():
        nowtime=time.strftime("%H:%M:%S")
        #lb.configure(text=nowtime,fg='green')
        var.set(nowtime)
        root.after(1000,gettime) #1000ms后调用gettime()函数

if __name__=='__main__':
        root.title('time')
        var=StringVar() #创建一个特殊变量对象
        lb=Label(root,textvariable=var,fg='red',font=('微软雅新',80)) #注意这里定义Label时定义textvariable而不是text
        lb.pack()
        gettime()
        root.mainloop()

        .文本框(Text)

        文本框方法如下:

方法 功能
delete(起始位置,[,终止位置]) 删除指定区域文本
get(起始位置,[,终止位置]) 获取指定区域文本
insert(位置,[,字符串]...) 将文本插入到指定位置
see(位置) 在指定位置是否可见文本,返回布尔值
index(标记) 返回标记所在的行和列
mark_names() 返回所有标记名称
mark_set(标记,位置) 在指定位置设置标记
mark_unset(标记) 去除标记

        上表位置的取值可为整数,浮点数或END(末尾),例如0.0表示第0列第0行

from tkinter import *
import time
import datetime

root=Tk()
root.geometry('500x300')

def gettime():
        nowtime=str(datetime.datetime.now())+'\n'
        txt.insert(END,nowtime)
        root.after(1000,gettime) #1000ms后调用gettime()函数

if __name__=='__main__':
        root.title('timetext')
        txt=Text(root)
        txt.pack()
        gettime()
        root.mainloop()

        .输入框(Entry):接受单行文本输入的控件。通常只用get()和delete()两个方法,delete(0,END)可清空输入框。

        (3)按钮(Button)

         button相应鼠标单击事件。相应的事件函数需先定义好,然后用以下两种方法调用函数。

        .直接调用函数。command=函数名。注意函数名后加括号不加参数

        .利用匿名函数调用函数和传递参数。参数的表达式为,“command=lambda”:函数名(参数列表)。例如:“command=lambda:run2(inp1.get(),inp2.get())”。

from tkinter import *
 
def run1():
     a = float(inp1.get())
     b = float(inp2.get())
     s = '%0.2f+%0.2f=%0.2f\n' % (a, b, a + b)
     txt.insert(END, s)   # 追加显示运算结果
     inp1.delete(0, END)  # 清空输入
     inp2.delete(0, END)  # 清空输入
 
def run2(x, y):
     a = float(x)
     b = float(y)
     s = '%0.2f+%0.2f=%0.2f\n' % (a, b, a + b)
     txt.insert(END, s)   # 追加显示运算结果
     inp1.delete(0, END)  # 清空输入
     inp2.delete(0, END)  # 清空输入
 
root = Tk()
root.geometry('460x240')
root.title('简单加法器')
 
lb1 = Label(root, text='请输入两个数,按下面两个按钮之一进行加法计算')
lb1.place(relx=0.1, rely=0.1, relwidth=0.8, relheight=0.1)
inp1 = Entry(root)
inp1.place(relx=0.1, rely=0.2, relwidth=0.3, relheight=0.1)
inp2 = Entry(root)
inp2.place(relx=0.6, rely=0.2, relwidth=0.3, relheight=0.1)
 
# 方法-直接调用 run1()
btn1 = Button(root, text='方法一', command=run1)
btn1.place(relx=0.1, rely=0.4, relwidth=0.3, relheight=0.1)
 
# 方法二利用 lambda 传参数调用run2()
btn2 = Button(root, text='方法二', command=lambda: run2(inp1.get(), inp2.get()))
btn2.place(relx=0.6, rely=0.4, relwidth=0.3, relheight=0.1)
 
# 在窗体垂直自上而下位置60%处起,布局相对窗体高度40%高的文本框
txt = Text(root)
txt.place(rely=0.6, relheight=0.4)
 
root.mainloop()

        (4)单选按钮(Radiobutton)

        排除具有共有属性外,还具有显示文本(text)、返回变量(variable)、返回值(value)、响应函数名(command)等重要属性。响应函数名“command=函数名”的用法与Button相同,函数名最后不要加括号。

        返回变量variable=var通常应预先声明变量的类型var=IntVar()或var=StringVar(),在所调用的函数中方可用var.get()方法获取被选中实例的value值。

from tkinter import *
def Mysel():
      dic = {0:'甲',1:'乙',2:'丙'}
      s = "您选了" + dic.get(var.get()) + "项"
      lb.config(text = s)
 
root = Tk()
root.title('单选按钮')
lb = Label(root)
lb.pack()
 
var = IntVar()
rd1 = Radiobutton(root,text="甲",variable=var,value=0,command=Mysel)
rd1.pack()
 
rd2 = Radiobutton(root,text="乙",variable=var,value=1,command=Mysel)
rd2.pack()
 
rd3 = Radiobutton(root,text="丙",variable=var,value=2,command=Mysel)
rd3.pack()
 
root.mainloop()

        (5)复选框:(Checkbutton)

        该控件除具有共有属性外,还具有显示文本(text)、返回变量(variable)、选中返回值(onvalue)和未选中默认返回值(offvalue)等重要属性。

        返回变量variable=var 通常可以预先逐项分别声明变量的类型var=IntVar() (默认)或 var=StringVar(), 在所调用的函数中方可分别调用 var.get()方法 取得被选中实例的 onvalue或offvalue值。


from tkinter import *
import tkinter
 
def run():
     if(CheckVar1.get()==0 and CheckVar2.get()==0 and CheckVar3.get()==0 and CheckVar4.get()==0):
         s = '您还没选择任何爱好项目'
     else:
         s1 = "足球" if CheckVar1.get()==1 else ""
         s2 = "篮球" if CheckVar2.get() == 1 else ""
         s3 = "游泳" if CheckVar3.get() == 1 else ""
         s4 = "田径" if CheckVar4.get() == 1 else ""
         s = "您选择了%s %s %s %s" % (s1,s2,s3,s4)
     lb2.config(text=s)
 
root = tkinter.Tk()
root.title('复选框')
lb1=Label(root,text='请选择您的爱好项目')
lb1.pack()
 
CheckVar1 = IntVar()
CheckVar2 = IntVar()
CheckVar3 = IntVar()
CheckVar4 = IntVar()
 
ch1 = Checkbutton(root,text='足球',variable = CheckVar1,onvalue=1,offvalue=0)
ch2 = Checkbutton(root,text='篮球',variable = CheckVar2,onvalue=1,offvalue=0)
ch3 = Checkbutton(root,text='游泳',variable = CheckVar3,onvalue=1,offvalue=0)
ch4 = Checkbutton(root,text='田径',variable = CheckVar4,onvalue=1,offvalue=0)
 
ch1.pack()
ch2.pack()
ch3.pack()
ch4.pack()
 
btn = Button(root,text="OK",command=run)
btn.pack()
 
lb2 = Label(root,text='')
lb2.pack()
root.mainloop()

        (6)列表框(Listbox)与 组合框(Combobox)

        . 列表框(Listbox)

方法 功能描述
curselection() 返回光标选中项目编号的元组,注意并不是单个的整数
delete(起始位置,终止位置) 删除项目,终止位置可省略,全部清空为delete(0,END)
get(起始位置,终止位) 返回范围所含项目文本的元组,终止位置可忽略
insert(位置,项目元素) 插入项目元素(若有多项,可用列表或元组类型赋值),若位置为END,则将项目元素添加在最后
size() 返回列表框行数

        列表框实质上就是将Python 的列表类型数据可视化呈现,在程序实现时,也可直接对相关列表数据进行操作,然后再通过列表框展示出来 。

from tkinter import *

root=Tk()
root.geometry('500x300')

def init():
        list=['数学','物理','化学','语文','外语']
        listbox.delete(0,END)
        for item in list:
                listbox.insert(END,item)
        return

def insert():
        if entry.get() != '':
                if listbox.curselection() !=():
                        id=listbox.curselection()[0]
                        listbox.insert(id,entry.get())
                else:
                        listbox.insert(END,entry.get())
        return
def change():
        if entry.get() !='':
                if listbox.curselection() != ():
                        id=listbox.curselection()[0]
                        listbox.delete(id)
                        listbox.insert(id,entry.get())
        return
def delete():
        if listbox.curselection() != ():
                listbox.delete(listbox.curselection())
        return
def clear():
        listbox.delete(0,END)
        return

if __name__=='__main__':
        root.title('列表框实验')
        fm1=Frame(root)
        fm2=Frame(root)
        fm1.place(relx=0.0)
        fm2.place(relx=0.5)
        listbox=Listbox(fm1)
        listbox.pack()
        entry=Entry(fm2)
        entry.pack()
        btn1=Button(fm2,text='初始化',command=init)
        btn2=Button(fm2,text='插入',command=insert)
        btn3=Button(fm2,text='修改',command=change)
        btn4=Button(fm2,text='删除',command=delete)
        btn5=Button(fm2,text='清空',command=clear)
        btn1.pack(fill=X)
        btn2.pack(fill=X)
        btn3.pack(fill=X)
        btn4.pack(fill=X)
        btn5.pack(fill=X)
        root.mainloop()

        . 组合框(Combobox)

        该控件并不包含在 tkinter 模块中,而是与 TreeView、Progressbar、Separator等控件一同包含在tkinter 的子模块ttk中。因此使用该控件前,应先from tkinter.ttk import *。

from tkinter import *
from tkinter.ttk import *
root=Tk()
root.geometry('500x300')

def cul(event): #注意一定要传递一个参数,将来这个参数代表实例本身
        c=cb.current()
        try:
                a=float(input1.get())
                b=float(input2.get())
        except:
                return
        dict={0:a+b,1:a-b,2:a*b,3:a/b}
        lb.configure(text=str(dict.get(c)))
        return

if __name__=='__main__':
        root.title('四则运算')
        input1=Entry(root)
        input2=Entry(root)
        input1.place(relx=0.1,rely=0.1)
        input2.place(relx=0.5,rely=0.1)
        cb=Combobox(root,values=['加','减','乘','除'])
        cb.place(relx=0.1,rely=0.5)
        cb.bind('<>',cul) #设置复选框被选择的相应函数
        lb=Label(root)
        lb.place(relx=0.5,rely=0.5)
        root.mainloop()

        指定变量var=StringVar(),并设置实例属性 textvariable = var,values=[列表...]。组合框控件常用方法有:获得所选中的选项值get()和获得所选中的选项索引current()。

        :定义的cur()函数必须带一个参数,名字可以任意。因为当定义<>事件的相应函数时,也将实例cb传入了进去。

        (7)滑块:(Scale)

        滑块(Scale)是一种直观地进行数值输入的交互控件。其主要属性见下表:

属性 功能描述
from_ 起始值(最小可取值)
lable 标签文字,默认为无
length 滑块控件实例宽(水平方向)或 高(垂直方向),默认为100像素
orient 滑块控件实例呈现方向,VERTCAL或HORIZONTAL(默认)
repeatdelay 鼠标响应延时,默认为 300ms
resolution 分辨精度,即最小值间隔
sliderlength 滑块宽度,默认为30 像素
state 状态,若设置 state=DISABLED,则滑块控件实例不可用
tickinterval 标尺间隔,默认为0,若设置过小,则会重叠
to 终止值(最大可取值)
variable 返回数值, 类型可为IntVar(整数)、DoubleVar(浮点数)、或 StringVar(字符串)
width 控件实例本身的宽度,默认为15像素

        滑块控件实例的主要方法比较简单,有 get()和set(值) ,滑块控件实例的主要方法比较简单,有 get()和set(值)。

        滑块实例也可绑定鼠标左键释放事件,并在执行函数中添加参数event来实现事件响应。注意是单括号‘<’,'>',不是双括号‘<<’,'>>'。

from tkinter import *

root=Tk()
root.geometry('500x300')
def getval(event):
        c=var.get()
        lb.configure(text=f'滑块的取值为{c}')
        return

if __name__=='__main__':
        root.title('滑块实验')
        var=DoubleVar()
        sc=Scale(root,orient=HORIZONTAL,length=200,from_=1.0,to=5.0,label='请拖动滑块',tickinterval=1,resolution=0.05,variable=var)
        sc.pack()
        lb=Label(root,text='滑块取值为1')
        lb.pack()
        sc.bind('',getval)
        root.mainloop()

        (8)菜单(Menu)

你可能感兴趣的:(python,linux,开发语言)