当前位置: 代码网 > it编程>前端脚本>Python > python+tkinter可视化GUI方式

python+tkinter可视化GUI方式

2026年04月13日 Python 我要评论
1.创建窗口import tkinter as tk #导入tkif __name__ == '__main__': root = tk.tk() #r

1.创建窗口

import tkinter as tk    #导入tk
if __name__ == '__main__':
    root = tk.tk()                   #root代表一个窗口,每调用一次函数就会新生成一个窗口
    root.mainloop()                  #无限循环,不断更新页面

2.窗口的定义和label的使用

一般的编写方式如何

一般会声明一个类

3.label、entry、text的基本属性和使用

标签、编辑框、文本框

(1)标签

标签的基本参数如下

(2)编辑框

(3)文本框

#-*- codeing = utf-8 -*- 
#@time : 2020/12/28 9:43
#@author : 招财进宝
#@file : _int_.py
#@software: pycharm

import tkinter as tk    #导入tk
from tkinter import *     #在下方进行使用tk.label()等方法时,可直接label()

class application(tk.frame):
    #类的初始化函数
    def __init__(self,root):        #传入root窗口
        super().__init__(root)
        self.master = root
        self.pack()                 #pack必须调用,用于将控件添加到窗口中,否则控件不显示
        self.envar = tk.stringvar(none, '123')

        self.intwind()              #调用窗口函数

    #创建窗口控件
    def intwind(self):
        #以下的每个控件都要pack
        label(self,text='123',fg='red',bg='green',width=50).pack()       #传入文本123,文字颜色红色,背景绿色,所占50个字的宽度
        entry(self,textvariable=self.envar,fg='#888',bg='#ff0',width=10).pack()     #编辑框

        text = text(self,fg='#ff0',bg='#000',width=20)                       #初始化一个文本控件对象
        text.pack()                             #在此处pack,pack后返回的值是none
        text.insert('end','111')                #在末尾插入文字123
        text.insert('end', '222')
        text.insert('1.4', '555')               #在第1行第4列插入数字
        text.insert('1.8', '333')               #此处指定位置插入成功
        text.insert('2.1', '444')              #当输入2.x或者0.x时,都是插入最后面,原因可能是只有一行,无换行
        text.insert('1.13', '666')


if __name__ == '__main__':
    root = tk.tk()                   #root代表一个窗口,每调用一次函数就会新生成一个窗口
    application = application(root)         #初始化一个对象,传入窗口root
    root.mainloop()                  #无限循环,不断更新页面

4.网格布局讲解

前面的排版都是以数列进行排版的,即一行一行的排版

这里使用grid函数,而不是使用pack函数了。

#-*- codeing = utf-8 -*- 
#@time : 2020/12/28 9:43
#@author : 招财进宝
#@file : _int_.py
#@software: pycharm

import tkinter as tk    #导入tk
from tkinter import *     #在下方进行使用tk.label()等方法时,可直接label()

class application(tk.frame):
    #类的初始化函数
    def __init__(self,root):        #传入root窗口
        super().__init__(root)
        self.master = root
        self.pack()                 #pack必须调用,用于将控件添加到窗口中,否则控件不显示
        self.envar = tk.stringvar(none, '123')

        self.intwind()              #调用窗口函数

    #创建窗口控件
    def intwind(self):
        #以下的每个控件都要pack
        label(self,text='123',fg='red',bg='green',width=2).grid(row=0,column=0)       #传入文本123,文字颜色红色,背景绿色,所占50个字的宽度
        entry(self,textvariable=self.envar,fg='#888',bg='#ff0',width=10).grid(row=0,column=1)     #编辑框

        text = text(self,fg='#ff0',bg='#000',width=20)                       #初始化一个文本控件对象
        #text.grid(columnspan=2,rowspan=2,pady=20,padx=50)               #合并两列,可达到居中的效果
        text.grid(columnspan=2, rowspan=2, ipadx=50)                        #ipadx会向外扩展,而padx会向里缩
        text.insert('end','111')                #在末尾插入文字123
        text.insert('end', '222')
        text.insert('1.4', '555')               #在第1行第4列插入数字
        text.insert('1.8', '333')               #此处指定位置插入成功
        text.insert('2.1', '444')              #当输入2.x或者0.x时,都是插入最后面,原因可能是只有一行,无换行
        text.insert('1.13', '666')


if __name__ == '__main__':
    root = tk.tk()                   #root代表一个窗口,每调用一次函数就会新生成一个窗口
    application = application(root)         #初始化一个对象,传入窗口root
    root.mainloop()                  #无限循环,不断更新页面

5.丰富窗口编写一个简单的窗口

编写一个类似下方框架的窗口

发现有两个横向组成,此时使用frame进行框架的布局,若直接单个控件的添加,不太好管理

6.创建按钮绑定事件和弹窗的使用

#-*- codeing = utf-8 -*- 
#@time : 2020/12/28 9:43
#@author : 招财进宝
#@file : _int_.py
#@software: pycharm

import tkinter as tk    #导入tk
from tkinter import *     #在下方进行使用tk.label()等方法时,可直接label()
from tkinter import messagebox      #此处引入messagebox,尽管之前引入*全部了但找不到

class application(tk.frame):
    #类的初始化函数
    def __init__(self,root):        #传入root窗口
        super().__init__(root)
        self.master = root
        self.pack()                 #pack必须调用,用于将控件添加到窗口中,否则控件不显示
        self.envar = tk.stringvar(none, '123')          #用于编辑框的文本信息输入
        #root.geometry('250x145')                        #设置窗口的大小
        root.minsize(250,145)                           #设置窗口的最小值
        root.maxsize(250, 145)                          #设置窗口的最大值
        root.title('登录')                            #设置窗口的名称
        #root.iconbitmap()                             #设置图标,必须是ico格式的
        self.username = tk.stringvar()  # 用于编辑框的文本信息输入,此处注意在前方要引入from tkinter import messagebox
        self.password = tk.stringvar()  # 用于编辑框的文本信息输入

        self.intwind()              #调用窗口函数

    def buttonactive(self):
        u = self.username.get()             #得到编辑框中的内容
        p = self.password.get()
        if len(u)==0 or len(p)==0:
            messagebox.showinfo('提示:','请完整信息')
            return
        messagebox.showinfo('提示:', '你输入的账号:%s\n密码:%s'%(u,p))

    #创建窗口控件
    def intwind(self):
        frame1 = frame(self)
        label(frame1,text='账号:').grid(row=0,column=0)
        entry(frame1,textvariable=self.username).grid(row=0,column=1)

        frame2 = frame(self)
        label(frame2, text='密码:').grid(row=0, column=0)
        entry(frame2, show='*',textvariable=self.password).grid(row=0, column=1)  #show='*',表示编辑框输入的东西都会显示*

        frame1.grid(pady=15)
        frame2.grid()

        button(self,text='登录',width=12,command=self.buttonactive).grid(pady=10)
        
if __name__ == '__main__':
    root = tk.tk()                   #root代表一个窗口,每调用一次函数就会新生成一个窗口
    application = application(root)         #初始化一个对象,传入窗口root
    root.mainloop()                  #无限循环,不断更新页面

7.下拉框combox的使用

添加下拉框可以选择是管理员还是普通成员的登录方式

但是上方并没有进行默认选择

8.获取或更改控件的属性值

#创建窗口控件
def intwind(self):
    frame1 = frame(self)
    label(frame1,text='账号:').grid(row=0,column=0)
    entry(frame1,textvariable=self.username).grid(row=0,column=1)

    frame2 = frame(self)
    label(frame2, text='密码:').grid(row=0, column=0)
    entry(frame2, show='*',textvariable=self.password).grid(row=0, column=1)  #show='*',表示编辑框输入的东西都会显示*

    frame3 = frame(self)
    label(frame3, text='身份:').grid(row=0, column=0)
    self.selector = ttk.combobox(frame3,values=('普通成员','管理员'),width=18) #引入from tkinter import ttk
    self.selector.grid(row=0, column=1)
    self.selector.current(0)
    self.selector.bind('<<comboboxselected>>',self.selectorlinstener)      #绑定一个监听事件/函数,用来监听选择的

    frame3.grid(pady=6)                 #将身份的模块放到最开始显示
    frame1.grid(pady=10)
    frame2.grid()

    btn = button(self,text='登录',width=12,command=self.buttonactive)
    btn.grid(pady=10)

    # 此处获取控件的属性的方法(cget()),所有控件都支持
    print(self.selector.cget('values'))             #获取下拉框的属性values
    print(self.selector.cget('width'))              #获取下拉框的属性width

    #使用config获取属性或者更改属性
    # self.selector.config(values=[1,2])      #重新配置属性values的值
    # self.selector.current(0)                #设置选择的当前值
    
    #使用字典键值对的方式获取属性值,或者更改属性值
    self.selector['values']=[1,2]             #此处的属性的设置相当于上面的

    print(btn['text'])                  #获取上一个按钮控件的属性值,打印
    btn['text']='123'                   #对按钮控件的属性值更改

返回的是字典,可以以字典的方式将值打印。

#创建窗口控件
def intwind(self):
    frame1 = frame(self)
    label(frame1,text='账号:').grid(row=0,column=0)
    entry(frame1,textvariable=self.username).grid(row=0,column=1)

    frame2 = frame(self)
    label(frame2, text='密码:').grid(row=0, column=0)
    entry(frame2, show='*',textvariable=self.password).grid(row=0, column=1)  #show='*',表示编辑框输入的东西都会显示*

    frame3 = frame(self)
    label(frame3, text='身份:').grid(row=0, column=0)
    self.selector = ttk.combobox(frame3,values=('普通成员','管理员'),width=18) #引入from tkinter import ttk
    self.selector.grid(row=0, column=1)
    self.selector.current(0)
    self.selector.bind('<<comboboxselected>>',self.selectorlinstener)      #绑定一个监听事件/函数,用来监听选择的

    frame3.grid(pady=6)                 #将身份的模块放到最开始显示
    frame1.grid(pady=10)
    frame2.grid()

    btn = button(self,text='登录',width=12,command=self.buttonactive)
    btn.grid(pady=10)

    # btn.grid_forget()                   #是控件不显示
    # btn.grid()                          #重新显示,需设置pady等

    btn.grid_remove()                   #同样隐藏控件
    btn.grid()                          #重新显示,设置的pady等参数已经保留

    btn.grid_propagate(0)               #0强制控件不变形(当放大缩小时)

    #self.grid_slaves(0,0)获取当前元素的子控件的第几行第几列的控件
    print(self.grid_slaves(0,0))        #获取第0行0列的frame3的控件
    print(self.grid_slaves(0, 1))        #没有第1列的frame,只有第0列的frame,故为空
    print(self.grid_slaves(1, 0))        #获取第1行0列的frame的控件

    # print(self.selector.grid_info())  # 获取selector控件的grid的属性
    # print(btn.grid_info())  # 获取btn控件的grid的属性

    # 此处获取控件的属性的方法(cget()),所有控件都支持
    print(self.selector.cget('values'))             #获取下拉框的属性values
    print(self.selector.cget('width'))              #获取下拉框的属性width

    #使用config获取属性或者更改属性
    # self.selector.config(values=[1,2])      #重新配置属性values的值
    # self.selector.current(0)                #设置选择的当前值

    #使用字典键值对的方式获取属性值,或者更改属性值
    self.selector['values']=[1,2]             #此处的属性的设置相当于上面的
    print(btn['text'])                  #获取上一个按钮控件的属性值,打印
   # btn['text']='123'                   #对按钮控件的属性值更改

9.tkinter自带剪切板操作

一个是添加剪切板,一个是清空剪切板,调用两个函数即可

虽然python中有个库也可以实现此操作,但使用tkinter的自带函数即可

self.clipboard_append('123')        #在剪切板放入数字123,可以ctr+v
print(self.clipboard_get())         #获取剪切板的内容并打印
self.clipboard_clear()              #清空剪切板内容,再ctr+v就显示不出了

10.所有的代码

#-*- codeing = utf-8 -*- 
#@time : 2020/12/28 9:43
#@author : 招财进宝
#@file : _int_.py
#@software: pycharm

import tkinter as tk    #导入tk
from tkinter import *     #在下方进行使用tk.label()等方法时,可直接label()
from tkinter import messagebox      #此处引入messagebox,尽管之前引入*全部了但找不到
from tkinter import ttk

class application(tk.frame):
    #类的初始化函数
    def __init__(self,root):        #传入root窗口
        super().__init__(root)
        self.master = root
        self.pack()                 #pack必须调用,用于将控件添加到窗口中,否则控件不显示
        self.envar = tk.stringvar(none, '123')          #用于编辑框的文本信息输入
        #root.geometry('250x145')                        #设置窗口的大小
        root.minsize(250,145)                           #设置窗口的最小值
        root.maxsize(250, 145)                          #设置窗口的最大值
        root.title('登录')                            #设置窗口的名称
        #root.iconbitmap()                             #设置图标,必须是ico格式的
        self.username = tk.stringvar()  # 用于编辑框的文本信息输入,此处注意在前方要引入from tkinter import messagebox
        self.password = tk.stringvar()  # 用于编辑框的文本信息输入
        self.select = tk.stringvar(none,'普通成员')     #设置默认数据为普通成员

        self.intwind()              #调用窗口函数

    def buttonactive(self):
        u = self.username.get()             #得到编辑框中的内容
        p = self.password.get()
        if len(u)==0 or len(p)==0:
            messagebox.showinfo('提示:','请完整信息')
            return
        messagebox.showinfo('提示:', '你输入的账号:%s\n密码:%s\n你的登录身份是:%s'%(u,p,self.select.get()))

    def selectorlinstener(self,*args):
        print(self.selector.get())
        self.select.set(self.selector.get())

    #创建窗口控件
    def intwind(self):
        frame1 = frame(self)
        label(frame1,text='账号:').grid(row=0,column=0)
        entry(frame1,textvariable=self.username).grid(row=0,column=1)

        frame2 = frame(self)
        label(frame2, text='密码:').grid(row=0, column=0)
        entry(frame2, show='*',textvariable=self.password).grid(row=0, column=1)  #show='*',表示编辑框输入的东西都会显示*

        frame3 = frame(self)
        label(frame3, text='身份:').grid(row=0, column=0)
        self.selector = ttk.combobox(frame3,values=('普通成员','管理员'),width=18) #引入from tkinter import ttk
        self.selector.grid(row=0, column=1)
        self.selector.current(0)
        self.selector.bind('<<comboboxselected>>',self.selectorlinstener)      #绑定一个监听事件/函数,用来监听选择的

        frame3.grid(pady=6)                 #将身份的模块放到最开始显示
        frame1.grid(pady=10)
        frame2.grid()

        btn = button(self,text='登录',width=12,command=self.buttonactive)
        btn.grid(pady=10)

        # btn.grid_forget()                   #是控件不显示
        # btn.grid()                          #重新显示,需设置pady等

        btn.grid_remove()                   #同样隐藏控件
        btn.grid()                          #重新显示,设置的pady等参数已经保留

        btn.grid_propagate(0)               #0强制控件不变形(当放大缩小时)

        #self.grid_slaves(0,0)获取当前元素的子控件的第几行第几列的控件
        print(self.grid_slaves(0,0))        #获取第0行0列的frame3的控件
        print(self.grid_slaves(0, 1))        #没有第1列的frame,只有第0列的frame,故为空
        print(self.grid_slaves(1, 0))        #获取第1行0列的frame的控件

        # print(self.selector.grid_info())  # 获取selector控件的grid的属性
        # print(btn.grid_info())  # 获取btn控件的grid的属性

        # 此处获取控件的属性的方法(cget()),所有控件都支持
        print(self.selector.cget('values'))             #获取下拉框的属性values
        print(self.selector.cget('width'))              #获取下拉框的属性width

        #使用config获取属性或者更改属性
        # self.selector.config(values=[1,2])      #重新配置属性values的值
        # self.selector.current(0)                #设置选择的当前值

        #使用字典键值对的方式获取属性值,或者更改属性值
        self.selector['values']=[1,2]             #此处的属性的设置相当于上面的
        print(btn['text'])                  #获取上一个按钮控件的属性值,打印
       # btn['text']='123'                   #对按钮控件的属性值更改

        self.clipboard_append('123')        #在剪切板放入数字123,可以ctr+v
        print(self.clipboard_get())         #获取剪切板的内容并打印
        self.clipboard_clear()              #清空剪切板内容,再ctr+v就显示不出了


if __name__ == '__main__':
    root = tk.tk()                   #root代表一个窗口,每调用一次函数就会新生成一个窗口
    application = application(root)         #初始化一个对象,传入窗口root
    root.mainloop()                  #无限循环,不断更新页面

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com