精华内容
下载资源
问答
  • 这是Python代码,关于Tkinter图形界面的一些简单的例子,还包括猜数字游戏和模拟计算器界面的简单实现。
  • 这是一个VB6的ADDIN(外接程序),用于使用VB6开发工具直接拖放控件,直接可视化完成Python的TKinter的GUI布局和设计,可以在VB界面上设置 控件的一些属性,最终自动生成必要的代码(包括回调函数框架),代码生成...
  • Python-Tkinter图形化界面设计(详细教程 )

    万次阅读 多人点赞 2019-08-05 23:07:41
    Python 图形化界面设计 文章参考:https://www.jianshu.com/p/91844c5bca78 1、图形化界面设计的基本理解 当前流行的计算机桌面应用程序大多数为图形化用户界面(Graphic User Interface,GUI),即通过鼠标对菜单...

    声明:本篇文章为转载自https://www.jianshu.com/p/91844c5bca78,在原作者的基础上添加目录导航,旨在帮助大家以更高效率进行学习和开发。

    Python-Tkinter 图形化界面设计(详细教程)

    本文目录

    一.图形化界面设计的基本理解

    当前流行的计算机桌面应用程序大多数为图形化用户界面(Graphic User Interface,GUI),即通过鼠标对菜单、按钮等图形化元素触发指令,并从标签、对话框等图型化显示容器中获取人机对话信息。
    Python自带了tkinter 模块,实质上是一种流行的面向对象的GUI工具包 TK 的Python编程接口,提供了快速便利地创建GUI应用程序的方法。其图像化编程的基本步骤通常包括:

    ○ 导入 tkinter 模块
    ○ 创建 GUI 根窗体
    ○ 添加人机交互控件并编写相应的函数。
    ○ 在主事件循环中等待用户触发事件响应。

    二.窗体控件布局

    2.1. 数据集导入

    根窗体是图像化应用程序的根控制器,是tkinter的底层控件的实例。当导入tkinter模块后,调用 Tk()方法可初始化一个根窗体实例 root ,用 title() 方法可设置其标题文字,用geometry()方法可以设置窗体的大小(以像素为单位)。将其置于主循环中,除非用户关闭,否则程序始终处于运行状态。执行该程序,一个窗体就呈现出来了。在这个主循环的根窗体中,可持续呈现中的其他可视化控件实例,监测事件的发生并执行相应的处理程序。下面是根窗体呈现示例:

    from tkinter import *
    root= Tk()
    root.title('我的第一个Python窗体')
    root.geometry('240x240') # 这里的乘号不是 * ,而是小写英文字母 x
    root.mainloop()
    

    在这里插入图片描述

    2.2. tkinter 常用控件

    返回目录

    常用控件:常用的10 多种,如下:
    在这里插入图片描述

    2.2.1 控件的共同属性

    返回目录

    在窗体上呈现的可视化控件,通常包括尺寸、颜色、字体、相对位置、浮雕样式、图标样式和悬停光标形状等共同属性。不同的控件由于形状和功能不同,又有其特征属性。在初始化根窗体和根窗体主循环之间,可实例化窗体控件,并设置其属性。父容器可为根窗体或其他容器控件实例。常见的控件共同属性如下表:
    在这里插入图片描述
    标签及常见属性示例:

    from  tkinter import *
    root = Tk()
    lb = Label(root,text='我是第一个标签',\
            bg='#d3fbfb',\
            fg='red',\
            font=('华文新魏',32),\
            width=20,\
            height=2,\
            relief=SUNKEN)
    lb.pack()
    root.mainloop()
    

    在这里插入图片描述
    其中,标签实例lb 在父容器root中实例化,具有代码中所示的text(文本)、bg(背景色)、fg(前景色)、font(字体)、width(宽,默认以字符为单位)、height(高,默认以字符为单位)和 relief(浮雕样式)等一系列属性。
    在实例化控件时,实例的属性可以“属性=属性值”的形式枚举列出,不区分先后次序。例如:“ text=‘我是第一个标签’ ”显示标签的文本内容,“bg=’#d3fbfb’”设置背景色为十六进制数RGB色 #d3fbfb等等。属性值通常用文本形式表示。
    当然如果这个控件实例只需要一次性呈现,也可以不必命名,直接实例化并布局呈现出来,例如:

    Label(root,text='我是第一个标签',font='华文新魏').pack()
    

    属性 relief 为控件呈现出来的3D浮雕样式,有 FLAT(平的)、RAISED(凸起的)、SUNKEN(凹陷的)、GROOVE(沟槽状边缘)和 RIDGE(脊状边缘) 5种。
    在这里插入图片描述

    2.3 控件布局

    返回目录

    控件的布局通常有pack()、grid() 和 place() 三种方法。
    pack和grid请参考:https://www.jianshu.com/p/91844c5bca78

    2.3.1 place()方法

    返回目录

    根据控件实例在父容器中的绝对或相对位置参数进行布局。其常用布局参数如下:
    x,y:控件实例在根窗体中水平和垂直方向上的其实位置(单位为像素)。注意,根窗体左上角为0,0,水平向右,垂直向下为正方向。
    relx,rely:控件实例在根窗体中水平和垂直方向上起始布局的相对位置。即相对于根窗体宽和高的比例位置,取值在0.0~1.0之间。
    height,width:控件实例本身的高度和宽度(单位为像素)。
    relheight,relwidth:控件实例相对于根窗体的高度和宽度比例,取值在0.0~1.0之间。

    利用place()方法配合relx,rely和relheight,relwidth参数所得的到的界面可自适应根窗体尺寸的大小。place()方法与grid()方法可以混合使用。如下例子:利用place()方法排列消息(多行标签)。
    在这里插入图片描述

    from tkinter import *
    root = Tk()
    root.geometry('320x240')
    
    msg1 = Message(root,text='''我的水平起始位置相对窗体 0.2,垂直起始位置为绝对位置 80 像素,我的高度是窗体高度的0.4,宽度是200像素''',relief=GROOVE)
    msg1.place(relx=0.2,y=80,relheight=0.4,width=200)
    root.mainloop()
    

    三、tkinter常见控件的特征属性

    3.1、文本输入和输出相关控件

    文本的输入与输出控件通常包括:标签(Label)、消息(Message)、输入框(Entry)、文本框(Text)。他们除了前述共同属性外,都具有一些特征属性和功能。

    ○ 3.1.1 标签(Label)和 消息(Message)

    返回目录

    除了单行与多行的不同外,属性和用法基本一致,用于呈现文本信息。值得注意的是:属性text通常用于实例在第一次呈现时的固定文本,而如果需要在程序执行后发生变化,则可以使用下列方法之一实现:1、用控件实例的configure()方法来改变属性text的值,可使显示的文本发生变化;2、先定义一个tkinter的内部类型变量var=StringVar() 的值也可以使显示文本发生变化。
    看下面的一个例子:制作一个电子时钟,用root的after()方法每隔1秒time模块以获取系统当前时间,并在标签中显示出来。
    方法一:利用configure()方法或config()来实现文本变化
    在这里插入图片描述

    import tkinter
    import time
    
    def gettime():
          timestr = time.strftime("%H:%M:%S") # 获取当前的时间并转化为字符串
          lb.configure(text=timestr)   # 重新设置标签文本
          root.after(1000,gettime) # 每隔1s调用函数 gettime 自身获取时间
    
    root = tkinter.Tk()
    root.title('时钟')
    
    lb = tkinter.Label(root,text='',fg='blue',font=("黑体",80))
    lb.pack()
    gettime()
    root.mainloop()
    

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

    import tkinter
    import time
    
    def gettime():
          var.set(time.strftime("%H:%M:%S"))   # 获取当前时间
          root.after(1000,gettime)   # 每隔1s调用函数 gettime 自身获取时间
    
    root = tkinter.Tk()
    root.title('时钟')
    var=tkinter.StringVar()
    
    lb = tkinter.Label(root,textvariable=var,fg='blue',font=("黑体",80))
    lb.pack()
    gettime()
    root.mainloop()
    

    ○ 3.1.2 文本框(Text)

    文本框的常用方法如下:
    在这里插入图片描述
    上表位置的取值可为整数,浮点数或END(末尾),例如0.0表示第0列第0行
    如下一个例子: 每隔1秒获取一次当前日期的时间,并写入文本框中,如下:本例中调用 datetime.now()获取当前日期时间,用insert()方法每次从文本框txt的尾部(END)开始追加文本。
    在这里插入图片描述

    from tkinter import *
    import time
    import datetime
    
    def gettime():
           s=str(datetime.datetime.now())+'\n'
           txt.insert(END,s)
           root.after(1000,gettime)  # 每隔1s调用函数 gettime 自身获取时间
    
    root=Tk()
    root.geometry('320x240')
    txt=Text(root)
    txt.pack()
    gettime()
    root.mainloop()
    

    ○ 3.1.3 输入框(Entry)

    返回目录

    通常作为功能比较单一的接收单行文本输入的控件,虽然也有许多对其中文本进行操作的方法,但通常用的只有取值方法get()和用于删除文本的delete(起始位置,终止位置),例如:清空输入框为delete(0,END)

    3.2 按钮(Button)

    返回目录

    主要是为响应鼠标单击事件触发运行程序所设的,故其除控件共有属性外,属性command是最为重要的属性。通常,将按钮要触发执行的程序以函数形式预先定义,然后可以用一下两种方法调用函数。Button按钮的状态有:'normal','active','disabled'

    ○ 直接调用函数。参数表达式为“command=函数名”,注意函数名后面不要加括号,也不能传递参数。如下面的command=run1:
    ○ 利用匿名函数调用函数和传递参数。参数的表达式为“command=lambda”:函数名(参数列表)。例如下面的:"command=lambda:run2(inp1.get(),inp2.get())"。

    ○ 看下面的例子:1.从两个输入框去的输入文本后转为浮点数值进行加法运算,要求每次单击按钮产生的算是结果以文本的形式追加到文本框中,将原输入框清空。2.按钮方法一不传参数调用函数run1()实现,按钮“方法二”用lambda调用函数run2(x,y)同时传递参数实现。
    在这里插入图片描述

    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()
    

    3.3 单选按钮

    返回目录

    (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()
    

    3.4 复选框

    返回目录

    (Checkbutton) 是为了返回多个选项值的交互控件,通常不直接触发函数的执行。该控件除具有共有属性外,还具有显示文本(text)、返回变量(variable)、选中返回值(onvalue)和未选中默认返回值(offvalue)等重要属性。返回变量variable=var 通常可以预先逐项分别声明变量的类型var=IntVar() (默认)或 var=StringVar(), 在所调用的函数中方可分别调用 var.get()方法 取得被选中实例的 onvalue或offvalue值。复选框实例通常还可分别利用 select()、deselect()和 toggle() 方法对其进行选中、清除选中和反选操作。

    ○ 如下的例子: 利用复选框实现,单击OK,可以将选中的结果显示在标签上。效果如下:

    在这里插入图片描述
    ○ 方法:利用函数中的 if-else 分支实现多项显示

    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()
    

    3.5 列表框 与 组合框

    3.5.1 列表框

    返回目录

    (Listbox) 可供用户单选或多选所列条目以形成人机交互。列表框控件的主要方法见下面的表:
    在这里插入图片描述
    执行自定义函数时,通常使用“实例名.surselection()” 或 “selected” 来获取选中项的位置索引。由于列表框实质上就是将Python 的列表类型数据可视化呈现,在程序实现时,也可直接对相关列表数据进行操作,然后再通过列表框展示出来,而不必拘泥于可视化控件的方法。看下面的一个例子:实现列表框的初始化、添加、插入、修改、删除和清空操作,如下:
    在这里插入图片描述

    from tkinter import *
    def ini():
          Lstbox1.delete(0,END)
          list_items = ["数学","物理","化学","语文","外语"]
          for item in list_items:
               Lstbox1.insert(END,item)
    
    def clear():
          Lstbox1.delete(0,END)
    
    def ins():
          if entry.get() != '':
              if Lstbox1.curselection() == ():
                  Lstbox1.insert(Lstbox1.size(),entry.get())
              else:
                  Lstbox1.insert(Lstbox1.curselection(),entry.get())
    
    def updt():
          if entry.get() != '' and Lstbox1.curselection() != ():
               selected=Lstbox1.curselection()[0]
               Lstbox1.delete(selected)
               Lstbox1.insert(selected,entry.get())
    
    def delt():
          if Lstbox1.curselection() != ():
               Lstbox1.delete(Lstbox1.curselection())
    
    root = Tk()
    root.title('列表框实验')
    root.geometry('320x240')
    
    frame1 = Frame(root,relief=RAISED)
    frame1.place(relx=0.0)
    
    frame2 = Frame(root,relief=GROOVE)
    frame2.place(relx=0.5)
    
    Lstbox1 = Listbox(frame1)
    Lstbox1.pack()
    
    entry = Entry(frame2)
    entry.pack()
    
    btn1 = Button(frame2,text='初始化',command=ini)
    btn1.pack(fill=X)
    
    btn2 = Button(frame2,text='添加',command=ins)
    btn2.pack(fill=X)
    
    btn3 = Button(frame2,text='插入',command=ins) # 添加和插入功能实质上是一样的
    btn3.pack(fill=X)
    
    btn4 = Button(frame2,text='修改',command=updt)
    btn4.pack(fill=X)
    
    btn5 = Button(frame2,text='删除',command=delt)
    btn5.pack(fill=X)
    
    btn6 = Button(frame2,text='清空',command=clear)
    btn6.pack(fill=X)
    
    root.mainloop()
    

    3.5.2 组合框

    返回目录

    (Combobox) 实质上是带文本框的上拉列表框,其功能也将是Python 的列表类型数据可视化呈现,并提供用户单选或多选所列条目以形成人机交互。在图形化界面设计时,由于其具有灵活的界面,因此往往比列表框更受喜爱。但该控件并不包含在 tkinter 模块中,而是与 TreeView、Progressbar、Separator等控件一同包含在tkinter 的子模块ttk中。如果使用该控件,应先与from tkinter import ttk 语句引用ttk子模块,然后创建组合框实例: 实例名=Combobox(根对象,[属性列表])
    指定变量var=StringVar(),并设置实例属性 textvariable = var,values=[列表…]。组合框控件常用方法有:获得所选中的选项值get()和获得所选中的选项索引current()。
    看下面的一个例子:实现四则运算计算器,将两个操作数分别填入两个文本框后,通过选择组合框中的算法触发运算,如下:
    在这里插入图片描述

    from tkinter.ttk import *
    
    def calc(event):
           a = float(t1.get())
           b = float(t2.get())
           dic = {0:a+b,1:a-b,2:a*b,3:a/b}
           c = dic[comb.current()]
           lbl.config(text=str(c))
    
    root = Tk()
    root.title('四则运算')
    root.geometry('320x240')
    
    t1 = Entry(root)
    t1.place(relx=0.1,rely=0.1,relwidth=0.2,relheight=0.1)
    
    t2 = Entry(root)
    t2.place(relx=0.5,rely=0.1,relwidth=0.2,relheight=0.1)
    
    var = StringVar()
    
    comb = Combobox(root,textvariable=var,values=['加','减','乘','除',])
    comb.place(relx=0.1,rely=0.5,relwidth=0.2)
    comb.bind('<<ComboboxSelected>>',calc)
    
    lbl=Label(root,text='结果')
    lbl.place(relx=0.5,rely=0.7,relwidth=0.2,relheight=0.3)
    
    root.mainloop()
    

    3.6 滑块

    返回目录

    (Scale) 是一种 直观地进行数值输入的交互控件,其主要属性见下表:
    在这里插入图片描述
    滑块控件实例的主要方法比较简单,有 get()set(值),分别为取值和将滑块设在某特定值上。滑块实例也可绑定鼠标左键释放事件<ButtoonRelease-1>,并在执行函数中添加参数event来实现事件响应。
    例如:在一个窗体上设计一个200像素宽的水平滑块,取值范围为1.0~5.0,分辨精度为0.05,刻度间隔为 1,用鼠标拖动滑块后释放鼠标可读取滑块值并显示在标签上。效果如下:
    在这里插入图片描述

    from tkinter  import  *
    
    def show(event):
          s = '滑块的取值为' + str(var.get())
          lb.config(text=s)
    
    root = Tk()
    root.title('滑块实验')
    root.geometry('320x180')
    var=DoubleVar()
    scl = Scale(root,orient=HORIZONTAL,length=200,from_=1.0,to=5.0,label='请拖动滑块',tickinterval=1,resolution=0.05,variable=var)
    scl.bind('<ButtonRelease-1>',show)
    scl.pack()
    
    lb = Label(root,text='')
    lb.pack()
    
    root.mainloop()
    

    3.7 菜单

    返回目录

    (Menu)用于可视化地为一系列的命令分组,从而方便用户找到和触发执行这些命令。这里Menu所实例化别的主要是菜单,其通式为:

    菜单实例名=Menu(根窗体)
    菜单分组1=Menu(菜单实例名)
    菜单实例名.add_cascade(<label=菜单分组1 显示文本>,<menu=菜单分组1>)
    菜单分组1.add_command(<label=命令1文本>,<command=命令1函数名>)
    

    其中较为常见的方法有:add_cascade()add_command()add_separator(),分别用于添加一个菜单分组、添加一条菜单命令和添加一条分割线。
    利用Menu控件也可以创建快捷菜单(又称为上下文菜单)。通常需要右击弹出的控件实例绑定鼠标右击响应事件,并指向一个捕获event参数的自定义函数,在该自定义函数中,将鼠标的触发位置event.x_root 和 event.y_root以post()方法传给菜单。
    例子: 仿照window自带的“记事本”中的文件和编辑 菜单,实现在主菜单个快捷菜单上触发菜单命令,并相应改变窗体上的标签的文本内容。效果如下:
    在这里插入图片描述

    from tkinter import *
    
    def new():
         s = '新建'
         lb1.config(text=s)
    
    def ope():
         s = '打开'
         lb1.config(text=s)
    
    def sav():
         s = '保存'
         lb1.config(text=s)
    
    def cut():
         s = '剪切'
         lb1.config(text=s)
    
    def cop():
         s = '复制'
         lb1.config(text=s)
    
    def pas():
         s = '粘贴'
         lb1.config(text=s)
    
    def popupmenu(event):
         mainmenu.post(event.x_root,event.y_root)
    
    root = Tk()
    root.title('菜单实验')
    root.geometry('320x240')
    
    lb1 = Label(root,text='显示信息',font=('黑体',32,'bold'))
    lb1.place(relx=0.2,rely=0.2)
    
    mainmenu = Menu(root)
    menuFile = Menu(mainmenu)  # 菜单分组 menuFile
    mainmenu.add_cascade(label="文件",menu=menuFile)
    menuFile.add_command(label="新建",command=new)
    menuFile.add_command(label="打开",command=ope)
    menuFile.add_command(label="保存",command=sav)
    menuFile.add_separator()  # 分割线
    menuFile.add_command(label="退出",command=root.destroy)
    
    menuEdit = Menu(mainmenu)  # 菜单分组 menuEdit
    mainmenu.add_cascade(label="编辑",menu=menuEdit)
    menuEdit.add_command(label="剪切",command=cut)
    menuEdit.add_command(label="复制",command=cop())
    menuEdit.add_command(label="粘贴",command=pas())
    
    root.config(menu=mainmenu)
    root.bind('Button-3',popupmenu) # 根窗体绑定鼠标右击响应事件
    root.mainloop()
    

    3.8 子窗体

    返回目录

    用Toplevel可新建一个显示在最前面的子窗体,其通式为: 字体实例名=Toplevel(根窗体),子窗体与根窗体类似,也可设置title、geomerty等属性,并在画布上布局其他控件。如下的例子:在根窗体上创建菜单,触发创建一个新的窗体
    在这里插入图片描述

    from tkinter import *
    
    def newwind():
          winNew = Toplevel(root)
          winNew.geometry('320x240')
          winNew.title('新窗体')
          lb2 = Label(winNew,text='我在新窗体上')
          lb2.place(relx=0.2,rely=0.2)
          btClose=Button(winNew,text='关闭',command=winNew.destroy)
          btClose.place(relx=0.7,rely=0.5)
    
    root = Tk()
    root.title('新建窗体实验')
    root.geometry('320x240')
    
    lb1 = Label(root,text='主窗体',font=('黑体',32,'bold'))
    lb1.place(relx=0.2,rely=0.2)
    
    mainmenu = Menu(root)
    menuFile = Menu(mainmenu)
    mainmenu.add_cascade(label='菜单',menu=menuFile)
    menuFile.add_command(label='新窗体',command=newwind)
    menuFile.add_separator()
    menuFile.add_command(label='退出',command=root.destroy)
    
    root.config(menu=mainmenu)
    root.mainloop()
    

    关闭窗体程序运行的方法通常用 destory(),而不建议用 quit()。用Toplevel 所创建的子窗体是非模式(Modeless)的窗体,虽然初建时子窗体在最前面,但根窗体上的控件实例也是可以被操作的。

    3.9 模式对话框(Modal)

    返回目录

    是相对于前面介绍的非模式窗体而言的,所弹出的对话框必须应答,在关闭之前无法操作其后面的其他窗体。常见的模式对话框有消息对话框、输入对话框、文件选择对话框、颜色选择对话框等。

    3.9.1 交互对话框

    返回目录

    (一)、消息对话框: 引用 tkinter.messagebox 包,可使用消息对话框函数。执行这些函数,可弹出模式消息对话框,并根据用户的响应但会一个布尔值。其通式为:

    消息对话框函数(<title=标题文本>,<message=消息文本>,[其他参数])
    

    看下面的例子:单击按钮,弹出确认取消对话框,并将用户回答显示在标签中。效果如下:
    在这里插入图片描述

    from tkinter import *
    import tkinter.messagebox
    
    def xz():
        answer=tkinter.messagebox.askokcancel('请选择','请选择确定或取消')
        if answer:
            lb.config(text='已确认')
        else:
            lb.config(text='已取消')
    
    root = Tk()
    
    lb = Label(root,text='')
    lb.pack()
    btn=Button(root,text='弹出对话框',command=xz)
    btn.pack()
    root.mainloop()
    

    (二)、输入对话框: 引用tkinter.simpledialog包,可弹出输入对话框,用以接收用户的简单输入。输入对话框常用 askstring()、askfloat()和askfloat() 三种函数,分别用于接收字符串、整数和浮点数类型的输入。
    如下面的例子:单击按钮,弹出输入对话框,接收文本输入显示在窗体的标签上。如下:
    在这里插入图片描述

    from tkinter.simpledialog import *
    
    def xz():
        s=askstring('请输入','请输入一串文字')
        lb.config(text=s)
    
    root = Tk()
    
    lb = Label(root,text='')
    lb.pack()
    btn=Button(root,text='弹出输入对话框',command=xz)
    btn.pack()
    root.mainloop()
    

    3.9.2 文件选择对话框

    返回目录

    引用tkinter.filedialog包,可弹出文件选择对话框,让用户直观地选择一个或一组文件,以供进一步的文件操作。常用的文件选择对话框函数有 askopenfilename()、askopenfilenames()和asksaveasfilename(),分别用于进一步打开一个文件、一组文件和保存文件。其中,askopenfilename()和asksaveasfilenamme()函数的返回值类型为包含文件路径的文件名字符串,而askopenfilenames()函数的返回值类型为元组。
    例如:单击按钮,弹出文件选择对话框(“打开”对话框),并将用户所选择的文件路径和文件名显示在窗体的标签上。如下
    在这里插入图片描述

    from tkinter import *
    import tkinter.filedialog
    
    def xz():
        filename=tkinter.filedialog.askopenfilename()
        if filename != '':
             lb.config(text='您选择的文件是'+filename)
        else:
             lb.config(text='您没有选择任何文件')
    
    root = Tk()
    
    lb = Label(root,text='')
    lb.pack()
    btn=Button(root,text='弹出文件选择对话框',command=xz)
    btn.pack()
    root.mainloop()
    

    3.9.3、颜色选择对话框

    返回目录

    引用tkinter.colorchooser包,可使用 askcolor()函数弹出模式颜色选择对话框,让用户可以个性化地设置颜色属性。该函数的返回形式为包含RGB十进制浮点元组和RGB十六进制字符串的元组类型,例如:“((135.527343.52734375,167.65234375,186.7265625)),’#87a7ba’”。通常,可将其转换为字符串类型后,再截取以十六进制数表示的RGB颜色字符串用于为属性赋值。
    举例:单击按钮,弹出颜色选择对话框,并将用户所选择的颜色设置为窗体上标签的背景颜色,如下:
    在这里插入图片描述

    from tkinter import *
    import tkinter.colorchooser
    
    def xz():
        color=tkinter.colorchooser.askcolor()
        colorstr=str(color)
        print('打印字符串%s 切掉后=%s' % (colorstr,colorstr[-9:-2]))
        lb.config(text=colorstr[-9:-2],background=colorstr[-9:-2])
    
    root = Tk()
    
    lb = Label(root,text='请关注颜色的变化')
    lb.pack()
    btn=Button(root,text='弹出颜色选择对话框',command=xz)
    btn.pack()
    root.mainloop()
    

    四、事件响应

    返回目录

    用tkinter 可将用户事件与自定义函数绑定,用键盘或鼠标的动作事件来响应触发自定义函数的执行。其通式为:

    控件实例.bind(<事件代码>,<函数名>)
    

    其中,事件代码通常以半角小于号“<”和大于号“>” 界定,包括事件和按键等 2~3个部分,它们之间用减号分隔,常见事件代码见下表:
    在这里插入图片描述
    例如,将框架控件实例frame 绑定鼠标右键单击事件,调用自定义函数 myfunc()可表示为"frame.bind(’’,myfunc)",注意: myfunc后面没有括号。将控件实例绑定到键盘事件和部分光标不落在具体控件实例上的鼠标事件时,还需要设置该实例执行focus_set() 方法获得焦点,才能对事件持续响应。例如: frame.focus_set()。所调用的自定义函数若需要利用鼠标或键盘的响应值,可将event作为参数,通过event的属性获取。event的属性见下表:
    在这里插入图片描述
    在这里插入图片描述

    from tkinter import *
    
    def show(event):
    s=event.keysym
    lb.config(text=s)
    
    root=Tk()
    root.title('按键实验')
    root.geometry('200x200')
    lb=Label(root,text='请按键',font=('黑体',48))
    lb.bind('<Key>',show)
    lb.focus_set()
    lb.pack()
    root.mainloop()
    

    补充:

    五、背景图片

    1、添加背景

    返回目录

    #插入文件图片
    import tkinter as tk
    
    root = tk.Tk()
    
    #创建一个标签类, [justify]:对齐方式
    textLabel = tk.Label(root,text="你在右边会看到一个图片,\n我在换个行",
    justify = tk.LEFT)#左对齐
    textLabel.pack(side=tk.LEFT)#自动对齐,side:方位
    
     
    
    #创建一个图片管理类
    photo = tk.PhotoImage(file="18.png")#file:t图片路径
    imgLabel = tk.Label(root,image=photo)#把图片整合到标签类中
    imgLabel.pack(side=tk.RIGHT)#自动对齐
    
    
    tk.mainloop()
    

    在这里插入图片描述

    返回目录

    import tkinter as tk
    
    root = tk.Tk()
    
    
    #增加背景图片
    photo = tk.PhotoImage(file="背景.png")
    theLabel = tk.Label(root,
             text="我是内容,\n请你阅读",#内容
             justify=tk.LEFT,#对齐方式
             image=photo,#加入图片
             compound = tk.CENTER,#关键:设置为背景图片
             font=("华文行楷",20),#字体和字号
             fg = "white")#前景色
    theLabel.pack()
    
     
    
    tk.mainloop()
    

    在这里插入图片描述

    返回目录

    #插入文件图片
    import tkinter as tk
    
    root = tk.Tk()
    
    frame1 = tk.Frame(root)#这是上面的框架
    frame2 = tk.Frame(root)#这是下面的框架
    
    
    var = tk.StringVar()#储存文字的类
    var.set("你在右边会看到一个图片,\n我在换个行")#设置文字
    
    #创建一个标签类, [justify]:对齐方式,[frame]所属框架
    textLabel = tk.Label(frame1,textvariable=var,
             justify = tk.LEFT)#显示文字内容 
    textLabel.pack(side=tk.LEFT)#自动对齐,side:方位
    
     
    
    #创建一个图片管理类
    photo = tk.PhotoImage(file="18.png")#file:t图片路径
    imgLabel = tk.Label(frame1,image=photo)#把图片整合到标签类中
    imgLabel.pack(side=tk.RIGHT)#自动对齐
    
    
    def callback():#触发的函数
      var.set("你还真按了")#设置文字
    
    #[frame]所属框架 ,text 文字内容 command:触发方法
    theButton = tk.Button(frame2,text="我是下面的按钮",command=callback)
    theButton.pack()#自动对齐
    
     
    
    frame1.pack(padx=10,pady=10)#上框架对齐
    frame2.pack(padx=10,pady=10)#下框架对齐
    
    
    tk.mainloop()
    

    在这里插入图片描述
    在这里插入图片描述

    返回目录

    六、打开摄像头,显示

    效果:
    在这里插入图片描述
    代码:

      from tkinter import *
        import cv2
        from PIL import Image,ImageTk
        
        
        def take_snapshot():
            print("有人给你点赞啦!")
        
        def video_loop():
            success, img = camera.read()  # 从摄像头读取照片
            if success:
                cv2.waitKey(100)
                cv2image = cv2.cvtColor(img, cv2.COLOR_BGR2RGBA)#转换颜色从BGR到RGBA
                current_image = Image.fromarray(cv2image)#将图像转换成Image对象
                imgtk = ImageTk.PhotoImage(image=current_image)
                panel.imgtk1 = imgtk
                panel.config(image=imgtk)
                root.after(1, video_loop)
        
        camera = cv2.VideoCapture(0)    #摄像头
        
        root = Tk()
        root.title("opencv + tkinter")
        #root.protocol('WM_DELETE_WINDOW', detector)
        
        
        panel = Label(root)  # initialize image panel
        panel.pack(padx=10, pady=10)
        # root.config(cursor="arrow")
        btn = Button(root, text="点赞!", command=take_snapshot)
        btn.pack(fill="both", expand=True, padx=10, pady=10)
        
        video_loop()
        
        root.mainloop()
        # 当一切都完成后,关闭摄像头并释放所占资源
        camera.release()
        cv2.destroyAllWindows()
    

    感谢前辈:
    https://www.jianshu.com/p/91844c5bca78
    https://www.cnblogs.com/banzhen/p/7427201.html
    https://blog.csdn.net/a1_a1_a/article/details/79981788

    展开全文
  • 【Python】Tkinter图形界面设计(GUI)

    千次阅读 多人点赞 2020-05-19 18:54:00
    作为 Python 开发者,图形用户界面(GUI)开发是必备技能之一。目前,市面上支持 Python 的“GUI 工具包”很多,各有特点,虽然大多数工具包的基础类似,但要学习一个新包并掌握其细节还是非常耗时的,因此,在选用...

    简介

    作为 Python 开发者,图形用户界面(GUI)开发是必备技能之一。目前,市面上支持

    Python 的“GUI 工具包”很多,各有特点,虽然大多数工具包的基础类似,但要学习一个
    新包并掌握其细节还是非常耗时的,因此,在选用工具包时应仔细权衡。本文将介绍
    Python 自带的 GUI 工具包 TKinter。

     

    TKinter
    Python 的 GUI 库非常多,之所以选择 Tkinter,一是最为简单,二是自带库,不需下载
    安装,随时使用,跨平台兼容性非常好,三则是从需求出发的,Python 在实际应用中极
    少用于开发复杂的桌面应用,毕竟,Python 的各种 GUI 工具包都“一般得很”,不具备优
    势。
    关于 GUI,泛泛而谈难免枯燥,鉴于此,本文将基于一系列实例来介绍 Tkinter 控件。


     

    窗口创建与布局

    做界面,首先需要创建一个窗口,Python Tkinter 创建窗口很简单,代码如下:

    from tkinter import *
    #初始化Tk()
    myWindow = Tk()
    #进入消息循环
    myWindow.mainloop()

     

    上述程序创建的窗口是非常简陋的,有待进一步美化,设置标题、窗口大小、窗口是否
    可变等,涉及属性有:title(设置窗口标题)、 geometry(设置窗口大小)、
    resizable(设置窗口是否可以变化长 宽)。请看如下实例:

    复制代码
    from tkinter import Tk
    #初始化Tk()
    myWindow = Tk()
    #设置标题
    myWindow.title('Python GUI Learning')
    #设置窗口大小
    myWindow.geometry('380x300')
    #设置窗口是否可变长、宽,True:可变,False:不可变
    myWindow.resizable(width=False, height=True)
    #进入消息循环
    myWindow.mainloop()
    复制代码

     

     

    进一步,将窗口放置于屏幕中央,如下实例:

    复制代码
    from tkinter import Tk
    #初始化Tk()
    myWindow = Tk()
    #设置标题
    myWindow.title('Python GUI Learning')
    #设置窗口大小
    width = 380
    height = 300
    #获取屏幕尺寸以计算布局参数,使窗口居屏幕中央
    screenwidth = myWindow.winfo_screenwidth()
    screenheight = myWindow.winfo_screenheight()
    alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth-width)/2, (screenheight-height)/2)
    myWindow.geometry(alignstr)
    #设置窗口是否可变长、宽,True:可变,False:不可变
    myWindow.resizable(width=False, height=True)
    #进入消息循环
    myWindow.mainloop()
    复制代码

     


    常用控件

    仅有窗口并不能实现交互,还需要控件,Tkinter 提供了各种控件,如按钮、标签和文本
    框。在一个 GUI 应用程序中使用,这些控件通常被称为控件或者部件,目前有15种
    Tkinter 部件,如下列表:

     


     几何管理

    Tkinter 控件有特定的几何状态管理方法,管理整个控件区域组织,以下是 Tkinter 公开
    的几何管理类:包、网格、位置。

     


    Lable控件标签控件,基本用法为:  Lable(root, option...) ,即:Label(根对象, [属性列表]),
    其中属性列表如下:

    Lable 控件实例
    实例1:标签展示文本,代码如下:

    复制代码
    from tkinter import*
    #初始化Tk()
    myWindow = Tk()
    #设置标题
    myWindow.title('Python GUI Learning')
    #创建一个标签,显示文本
    Label(myWindow, text="user-name",bg='red',font=('Arial 12 bold'),width=20,height=5).pack()
    Label(myWindow, text="password",bg='green',width=20,height=5).pack()
    #进入消息循环
    myWindow.mainloop()
    复制代码

     

    执行结果:

    实例2:标签展示图标,代码如下:

     

    复制代码
    from tkinter import*
    #初始化Tk()
    myWindow = Tk()
    #设置标题
    myWindow.title('Python GUI Learning')
    #创建一个标签,显示图标
    logo = PhotoImage(file="/Users/guojin/book/temp.gif")
    Label(myWindow, image=logo).pack(side='left')
    #进入消息循环
    myWindow.mainloop()
    复制代码

     

    运行结果:

    实例3:标签图文混叠,边距控制,代码如下:

    复制代码
    from tkinter import*
    #初始化Tk()
    myWindow = Tk()
    #设置标题
    myWindow.title('Python GUI Learning')
    #创建一个标签,显示文本
    logo = PhotoImage(file="/Users/guojin/book/temp.gif")
    explanation = """At present, only GIF and PPM/PGM
    formats are supported, but an interface
    exists to allow additional image file
    formats to be added easily."""
    Label(myWindow,compound=CENTER,text=explanation,image=logo).pack(side="right")
    #进入消息循环
    myWindow.mainloop()
    复制代码

     

     运行结果:

     


     Button控件

    Button 控件是一个标准的 Tkinter 部件,用于实现各种按钮。按钮可以包含文本或图
    像,还可以关联 Python 函数。
    Tkinter 的按钮被按下时,会自动调用该函数。
    按钮文本可跨越一个以上的行。此外,文本字符可以有下划线,例如标记的键盘快捷
    键。默认情况下,使用 Tab 键可以移动到一个按钮部件,用法如下:
    Entry(根对象, [属性列表]),即Entry(root, option...)
    常用的属性列表如下:

    Button 实例:

    实例1:创建按钮,代码如下:

    复制代码
    from tkinter import*
    #初始化Tk()
    myWindow = Tk()
    #设置标题
    myWindow.title('Python GUI Learning')
    #创建两个按钮
    b1=Button(myWindow, text='button1',bg="red", relief='raised', width=8, height=2)
    b1.grid(row=0, column=0, sticky=W, padx=5,pady=5)
    b2=Button(myWindow, text='button2', font=('Helvetica 10 bold'),width=8, height=2)
    b2.grid(row=0, column=1, sticky=W, padx=5, pady=5)
    #进入消息循环
    myWindow.mainloop()
    复制代码

     

    运行结果:

    实例2:创建按钮并绑定响应函数,输入半径,计算圆面积并输出,代码如下:

    复制代码
    from tkinter import*
    def printInfo():
      #清理entry2
      entry2.delete(0, END)
      #根据输入半径计算面积
      R=int(entry1.get())
      S= 3.1415926*R*R
      entry2.insert(10, S)
      #清空entry2控件
      entry1.delete(0, END)
    #初始化Tk()
    myWindow = Tk()
    #设置标题
    myWindow.title('Python GUI Learning')
    #标签控件布局
    Label(myWindow, text="input").grid(row=0)
    Label(myWindow, text="output").grid(row=1)
    #Entry控件布局
    entry1=Entry(myWindow)
    entry2=Entry(myWindow)
    entry1.grid(row=0, column=1)
    entry2.grid(row=1, column=1)
    #Quit按钮退出;Run按钮打印计算结果
    Button(myWindow, text='Quit', command=myWindow.quit).grid(row=2, column=0,sticky=W, padx=5, pady=5)
    Button(myWindow, text='Run', command=printInfo).grid(row=2, column=1, sticky=W, padx=5, pady=5)
    #进入消息循环
    myWindow.mainloop()
    复制代码

     

     运行结果:

    输入半径:

    点击‘Run’计算面积:

     

     


     Checkbutton控件Checkbutton 是复选框,又称为多选按钮,可以表示两种状态。用法为: Checkbutton
    ( root, option, ... ), 其中可选属性 option 有很多,如下表所示:

     

    以下是这个小工具的常用方法:

    实例1:创建一组复选框,代码如下:

     

    复制代码
    from tkinter import*
    #初始化Tk()
    myWindow = Tk()
    #设置标题
    myWindow.title('Python GUI Learning')
    # 用来获取复选框是否被勾选,通过chVarDis.get()来获取其的状态,其状态值为int类型 勾选为1
    chVarDis = IntVar()
    # text为该复选框后面显示的名称, variable将该复选框的状态赋值给一个变量,当state='disa
    check1 = Checkbutton(myWindow, text="Disabled", variable=chVarDis, state='disabled')
    # 该复选框是否勾选,select为勾选, deselect为不勾选 check1.select() # sticky=tk.W 当该列中其他行或该行中的其他列的某一个功能拉长这列的宽度或高度时, # 设定该值可以保证本行保持左对齐,N:北/上对齐 S:南/下对齐 W:西/左对齐 E:东/右对齐 check1.grid(column=0, row=0, sticky=W) chvarUn = IntVar() check2 = Checkbutton(myWindow, text="UnChecked", variable=chvarUn) check2.deselect() check2.grid(column=1, row=0, sticky=W) chvarEn = IntVar() check3 = Checkbutton(myWindow, text="Enabled", variable=chvarEn) check3.select() check3.grid(column=2, row=0, sticky=W) #进入消息循环 myWindow.mainloop()
    复制代码

     

    实例2:绑定响应函数,代码如下:

     

    复制代码
    from tkinter import*
    def callCheckbutton():
      #改变v的值,即改变Checkbutton的显示值
      v.set('check CheckButton')
    #初始化Tk()
    myWindow = Tk()
    #设置标题
    myWindow.title('Python GUI Learning')
    v = StringVar()
    v.set('check python')
    #绑定v到Checkbutton的属性textvariable
    Checkbutton(myWindow,textvariable = v,command = callCheckbutton).pack()
    #进入消息循环
    myWindow.mainloop()
    复制代码

     

     


     Radiobutton控件

    单选按钮是一种可在多个预先定义的选项中选择出一项的 Tkinter 控件 。单选按钮可显
    示文字或图片,显示文字时只能使用预设字体,该控件可以绑定一个 Python 函数或方
    法,当单选按钮被选择时,该函数或方法将被调用。
    单选按钮(Radio Button)这个名字来源于收音机(Radio)上的调频按钮, 这些按钮用
    来选择特定波段或预设电台,如果一个按钮被按下, 其他同类的按钮就会弹起,即同时
    只有一个按钮可被按下。
    一组单选按钮控件和同一个变量关联。点击其中一个单选按钮将把这个变量设为某个预
    定义的值。一般用法为: Radiobutton(myWindow,options) ,其中 option 与
    Checkbutton,Button 大多重合,用法一致。

    实例:创建单选按钮并绑定响应函数,代码如下:

    复制代码
    from tkinter import*
    #初始化Tk()
    myWindow=Tk()
    myWindow.title('Python GUI Learning')
    v=IntVar()
    #列表中存储的是元素是元组
    language=[('python',0),('C++',1),('C',2),('Java',3)]
    #定义单选按钮的响应函数
    def callRB():
      for i in range(4):
      if (v.get()==i):
        root1 = Tk()
        Label(root1,text='你的选择是'+language[i][0]+'!',fg='red',width=20, height=6).pack()
        Button(root1,text='确定',width=3,height=1,command=root1.destroy).pack(side='bottom')
    Label(myWindow,text='选择一门你喜欢的编程语言').pack(anchor=W)
    #for循环创建单选框
    for lan,num in language:
      Radiobutton(myWindow, text=lan, value=num, command=callRB, variable=v).pack(anchor=W)
    #进入消息循环
    myWindow.mainloop()
    复制代码

     

     运行结果:

     


     Menu控件

    Menu被用来创建一个菜单,创建Menu类的实例,然后使用add方法添加命令或者其他
    菜单内容。使用方法如下:
    Menu(root,option,…)
    其中 option 列表如下:

    特有函数如下:

    实例:创建一个菜单组,代码如下:

    复制代码
    from tkinter import *
    #创建窗口
    myWindow=Tk()
    myWindow.title("菜单")
    myWindow.geometry("400x300+300+100")
    # 创建一个菜单项,类似于导航栏,顶层菜单
    menubar=Menu(myWindow)
    # 创建菜单项
    fmenu1=Menu(myWindow)
    for item in ['新建','打开','保存','另存为']:
        # 如果该菜单是顶层菜单的一个菜单项,则它添加的是下拉菜单的菜单项。则他添加的是下拉菜单的菜单项。
        fmenu1.add_command(label=item)
    
    fmenu2=Menu(myWindow)
    for item in ['复制','粘贴','剪切']:
        fmenu2.add_command(label=item)
    
    fmenu3=Menu(myWindow)
    for item in ['大纲视图','web视图']:
        fmenu3.add_command(label=item)
    
    fmenu4=Menu(myWindow)
    for item in ["版权信息","其它说明"]:
        fmenu4.add_command(label=item)
    
    # add_cascade 的一个很重要的属性就是 menu 属性,它指明了要把那个菜单级联到该菜单项上,
    # 当然,还必不可少的就是 label 属性,用于指定该菜单项的名称
    menubar.add_cascade(label="文件",menu=fmenu1)
    menubar.add_cascade(label="编辑",menu=fmenu2)
    menubar.add_cascade(label="视图",menu=fmenu3)
    menubar.add_cascade(label="关于",menu=fmenu4)
    
    # 最后可以用窗口的 menu 属性指定我们使用哪一个作为它的顶层菜单
    myWindow.config(menu=menubar)
    #进入消息循环
    myWindow.mainloop()
    复制代码

     

     运行结果:

     

     


     Message控件

    Message 控件用来展示一些文字短消息。Message 和 Label 控件有些类似, 但在展示文
    字方面比 Label 要灵活,比如 Message 控件可以改变字体,而 Label 控件只能使用一种
    字体,它提供了一个换行对象,以使文字可以断为多行。
    它可以支持文字的自动换行及对齐,这里要澄清一下前面提到的 Message 控件可以改变
    字体的说法: 这是说我们可以为单个控件设置任意字体, 控件内的文字都将显示为该字
    体,但我们不能给单个控件内的文字设置多种字体,如果你需要这么做,可以考虑使用
    Text 控件。
    创建一个 Message 控件的语法如下:
    w = Message ( root, option, ... )
    其中 option 列表如下:

    请看下面实例:

     

    复制代码
    from tkinter import *
    #初始化Tk()
    myWindow=Tk()
    #创建一个Message
    whatever_you_do = "Only those who have the patience to do simple things per
    msg = Message(myWindow, text = whatever_you_do)
    msg.config(bg='lightgreen', font=('times', 20, 'italic'))
    msg.pack( )
    #进入消息循环
    myWindow.mainloop()
    展开全文
  • import tkinter as tk from tkinter import filedialog from PIL import Image, ImageTk def creat_windows(): win = tk.Tk() # 创建窗口 sw = win.winfo_screenwidth() sh = win.winfo_screenheight() ww, wh ...

    simple_Tk.py

    # -*- coding: utf-8 -*-
    import tkinter as tk
    from tkinter import filedialog
    from PIL import Image, ImageTk
    
    def creat_windows():
        win = tk.Tk() # 创建窗口
        sw = win.winfo_screenwidth()
        sh = win.winfo_screenheight()
        ww, wh = 400, 450
        x, y = (sw-ww)/2, (sh-wh)/2
        win.geometry("%dx%d+%d+%d"%(ww, wh, x, y-40)) # 居中放置窗口
    
        win.title('Hello World!') # 窗口命名
    
        bg1_open = Image.open("data/picture.jpg").resize((300, 300))
        bg1 = ImageTk.PhotoImage(bg1_open)
        canvas = tk.Label(win, image=bg1)
        canvas.pack()
    
        var = tk.StringVar() # 创建变量文字
        tk.Label(win, textvariable=var, bg='#C1FFC1', font=('Arial', 21), width=20, height=2).pack()
        tk.Button(win, text='choose one picture to show', width=20, height=2, bg='#FF8C00', command=lambda:main(var, canvas), font=('Arial', 10)).pack()
        
        win.mainloop()
    
    def main(var, canvas):
        var.set('Don\'t touch me!')
        file_path = filedialog.askopenfilename()
        bg1_open = Image.open(file_path)
        bg1_resize = bg1_open.resize((280, 280))
        bg1 = ImageTk.PhotoImage(bg1_resize)
        canvas.configure(image=bg1)
        canvas.image = bg1
    
    if __name__ == '__main__':
        creat_windows())
    
    展开全文
  • tkinter界面设计中,使用模板继承,这样继承过来的代码具有模板的特性。这样做的主要目的是想在基础模板中调整字体、字号,前景颜色,背景颜色等,使继承于该基础模板的多个其他界面设计文件统一具有基础模板的...

    在tkinter的界面设计中,使用模板继承,这样继承过来的代码具有模板的特性。这样做的主要目的是想在基础模板中调整字体、字号,前景颜色,背景颜色等,使继承于该基础模板的多个其他界面设计文件统一具有基础模板的设定,从而达到界面风格统一的效果。

    项目文件夹

    project    # 项目文件夹
        login.py        # 主程序文件
        database.py     # 操作数据库的文件
        gbase.db        # 数据库文件
        ui    # 程序界面文件夹
            __ini__.py   # 空文件,使该文件夹成为包文件
            ui_base.py   # 基础界面文件,设定字体、字号等样式
            ui_login.py  # 登录窗口的界面设计文件,继承自ui_base.py
            ui_tools.py  # 一些界面设计的工具模块
    

    基础模板 ui_base.py

    import tkinter as tk
    from tkinter import ttk
    
    
    class BaseWindow(tk.Tk):
        """创建基础窗口,设置常用参数"""
        def __init__(self):
            super().__init__()
            self.font_name = '微软雅黑'
            self.font_size = 14
            self.font = (self.font_name, self.font_size)
            self.option_add('*Font', self.font)
            ttk.Style().configure(".", font=self.font)
    

    登录界面继承于该模板 ui_login.py

    import tkinter as tk
    from tkinter import ttk
    from . import ui_base  # 使用相对导入,使不同包的 import 能找到该模块
    from . import ui_tools
    
    
    class Login(ui_base.BaseWindow):
        """登录窗口UI"""
        def __init__(self):
            """初始化"""
            super().__init__()  # 有点相当于tk.Tk()
            self.welcome = tk.StringVar()
            self.user = tk.StringVar()
            self.pwd = tk.StringVar()
            self.msg = tk.StringVar()
            self.btn_ok = ttk.Button()
            self.run()
    
        def run(self):
            self.title('系统登录')
            self.resizable(False, False)
    
            frm = tk.Frame(self)
            frm.pack(padx=40, pady=20)
    
            self.welcome.set('欢迎光临高卢美发造型管理系统')
            tk.Label(frm, textvariable=self.welcome, font=(self.font_name, self.font_size + 2, 'bold'),
                     fg='green').pack(pady=20)
    
            user_frm = tk.Frame(frm)
            user_frm.pack(pady=10)
            pwd_frm = tk.Frame(frm)
            pwd_frm.pack(pady=10)
            btn_frm = tk.Frame(frm)
            btn_frm.pack(pady=10)
    
            tk.Label(user_frm, text='用户名', width=8, anchor='w').pack(padx=5, side='left')
            tk.Entry(user_frm, textvariable=self.user).pack(side='left')
    
            tk.Label(pwd_frm, text='密码', width=8, anchor='w').pack(padx=5, side='left')
            tk.Entry(pwd_frm, textvariable=self.pwd, show="*").pack(side='left')
    
            self.btn_ok = ttk.Button(btn_frm, text='确定')
            self.btn_ok.pack(padx=10, side='left')
            ttk.Button(btn_frm, text='取消', command=self.destroy).pack(side='left')
    
            tk.Label(frm, textvariable=self.msg, fg='red').pack(pady=10)
    
            ui_tools.WinCenter(self)
    
    
    if __name__ == '__main__':
        lg = Login()
    
        lg.title('逻辑与界面分离设计')
        lg.welcome.set('欢迎你UI时代!')
    
        lg.mainloop()
    

    登录主程序 login.py

    from ui import ui_login
    import hashlib
    import database
    
    lg = ui_login.Login()
    
    
    def verify():
        code = lg.user.get()
        pwd = lg.pwd.get()
        lg.msg.set('')
        if not code:
            lg.msg.set('用户名不能为空!')
            return
        elif not pwd:
            lg.msg.set('密码不能为空!')
            return
    
        password = hashlib.md5((code+pwd).encode()).hexdigest()
    
        db = database.Sqlite3DB()
        sql_text = f"select id from users where code = ? and password = ? ;"
        db.cur.execute(sql_text, (code, password))
        result = db.cur.fetchone()
        if result:
            lg.msg.set('登录成功!')
        else:
            lg.msg.set('用户名或者密码错误!')
    
    
    lg.btn_ok.configure(command=verify)
    
    
    lg.mainloop()
    

    发布日期:8月 28, 2021
    作者:lshgly
    编辑tkinter 界面设计中的模板继承
    分类:IT、Uncategorized、全部、原创
    标签:python、tkinter、模板继承、界面设计

    展开全文
  • 利用 tkinter 制作的一个抽奖界面,抽奖转盘自动旋转时自动获取指针指向的当前ID,并在停止时获取输出抽出的奖项名称
  • Tkinter登陆界面设计

    千次阅读 2019-05-07 21:51:54
    Tkinter登陆界面设计 程序详细解释可参考莫凡:https://morvanzhou.github.io/tutorials/python-basic/tkinter/3-03-example3/ 注意,可在源程序的基础上进行添加自己的程序。 程序运行结果: 程序代码: # -*- ...
  • 界面设计采用python tkinter ,绘图采用matplotlib。 程序设计完成在测试阶段出现绘图完成后界面自动关闭情况。 二、问题溯源 通过调试发现当plt.close()去掉后问题得到暂时解决,但该解决方案存在内存溢出的...
  • 类似qt designer或者vb,可以在页面上拖拖画画,绑定属性和事件,就可以生成tkInter界面的python代码的工具 需要依赖python 2.7/3.5+,ActiveTcl 8.6+以上。如启动时提醒找不到wish.exe,请将ActiveTcl的可执行文件...
  • 标题 tkinter 界面设计 — 画板 上一次写文章还是7.18号了,到现在快20天没有更新了。也不是因为懒,我学习python的时间并不是很多。只有每天早上或者晚上下班回家才有时间。从上次更新到今天。这20天的时间里,学习...
  • Python图形界面设计(Tkinter库)

    千次阅读 多人点赞 2019-08-20 15:45:33
    文章目录创建 Windows 窗口几何布局管理器pack 几何布局管理器grid 几何布局管理器place 几何布局管理器Tkinter 组件标签组件 Label按钮组件 Button单行文本框组件 Entry 和多行文本框组件 Text列表框组件 Listbox...
  • Python界面设计Tkinter之简单实例

    千次阅读 2020-05-10 00:28:28
    本篇是简单的实例,用到的理论知识在上一篇:Python界面GUI学习路程之Tkinter之窗口交互设计 声名:文中所用代码运行环境:Window 10 64bit,Python 3.8 目录 1.获取文本框Entry中的内容 2.限制文本框的输入内容...
  • 简介作为 Python 开发者,图形用户界面(GUI)开发是必备技能之一。目前,市面上支持Python 的“GUI 工具包”很多,各有特点,虽然大多数工具包的基础类似,但要学习一个新包并掌握其细节还是非常耗时的,因此,在...
  • 我在一开始的时候不知道tkinter可以直接用一个可视化的界面来进行界面设计,当时是直接用代码来生成窗口、设计控件,再设计功能,感觉效率不是很高。因此我觉得要想做GUI提高效率还是需要用到可视化界面来拖放控件...
  • Python中Tkinter 图形化界面设计(详细教程)

    千次阅读 多人点赞 2020-12-08 17:41:41
    Python-Tkinter 图形化界面设计(详细教程)一、图形化界面设计的基本理解二、 窗体控件布局2.1 根窗体呈现示例2.2 tkinter 常用控件2.2.1常用控件2.2.2 控件的共同属性2.3 控件布局2.3.1 place() 使用方法三、...
  • Tkinter界面编程案例(简单) 文章目录Tkinter界面编程案例(简单)一、基本写法框架1、def _ _init_ _(self):2、self._ create_body_()3、def _ set_window_(self)二、Tk(根窗口)和 Toplevel(顶级窗口)的方法...
  • 主要为大家详细介绍了基于python的Tkinter编写登陆注册界面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 一个GUI应用程序有很多的组件,将这些组件有序美观地排布在窗口上,需要用Tkinter提供的布局管理器,tkinter提供了三种管理其:pack,grid和place. 下面这个代码是用grid来进行的布局管理。 在看代码之前介绍几个重要...
  • Python-Tkinter图形化界面设计

    千次阅读 多人点赞 2019-10-22 09:23:53
    综合了以下的文章: 转载自:...目录一.图形化界面设计的基本理解二.Tkinter是什么三.窗体控件1) 数据集导入2) Tkinter 控件详细介绍1. Tkinter 模块元素简要说明2. 控件的共同属性3. 控件布局3.1...
  • 不过说实在,使用Python开发GUI界面还是麻烦了一些了,自带的标准库Tkinter使用起来非常简单,不过对于习惯了VB拖放控件完成界面设计的偶来说,还是不够人性化。TK也有一个工具叫GUI Builder,不过它使用Layout布局...
  • tkinter UI界面模板

    2021-06-29 17:38:48
    写在前面  由于每次都需要ui界面代码,所以想着直接做个属于自己的模板,每次只修改一部分就可以使用,今天抽空写一写,也是帮自己复习。(当然,我还是菜鸟) 直接开始 在这里插入代码片 ...
  • 不得不说,因为tkinter内置库可设置组件的参数有限,UI界面我只能做到这一步啦。 等不及要完整代码的小伙伴可以在网盘链接下载,供大家学习和参考: 百度网盘 请输入提取码ajie 当然了,界面好看是仅仅不够...
  • 采用pandas导入考试题库,通过tkinter设计界面,模拟上级考试答题过程,答题结果比对,正确率分析
  • 本教程共用12个例子,将python tkinter所常用的控件进行用法展示,所展示的控件分别为 Label控件,Entry控件,Text控件,Button控件,canvas控件,Radiobutton控件,Checkbutton控件,List控件,Scale控件,Menu控件...
  • Python 提供了多个图形开发界面的库,在此介绍一下自己对 Tkinter 学习的理解和经验,并用其制作几个小项目。具体代码可以去我的GitHub网站下载。 程序 1. 入门第一个窗口 from tkinter import * window = Tk() # ...
  • tkinter写的python GUI注册界面实例,包括注册和登录。使用pickle库来序列化用户名和密码
  • tkinter.pack设计复杂界面布局

    万次阅读 多人点赞 2018-11-04 12:41:59
    对程序员来说,界面设计的实现,要解决的一个主要问题就是如何根据界面设计的需求,将组件以规定的大小放置在规定的位置。tkinter是python语言中常用的界面实现模块,其中pack()方法,可创建浮动,自动伸缩扩展的...
  • 主要为大家详细介绍了Python使用Tkinter实现机器人走迷宫,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • python3的tkinter登录界面设计+mysql数据库的导入数据

    千次阅读 多人点赞 2019-08-16 09:17:14
    在上文中我只给了界面代码,注释了数据库部分的代码,本来想将数据可视化界面做好了再搞一个完整的登录和数据可视化界面的,但是由于有其它的事要做,所以就将之前的代码包装了一下,这样整段代码只包含三个函数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,551
精华内容 1,820
关键字:

tkinter界面设计代码