当前位置: 首页 > article >正文

python tkinter

基本使用

基于tkinter创建 GUI基本四步:窗口->组件->布局->事件

1.创建窗口对象

from tkinter import *

root = Tk()  # 创建窗口

root.mainloop()  # 进入事件循环

2.创建组件

按钮文本等组件

btn = Button(root)  # 创建Button组件,使组件在root窗口展示
btn['text'] = '我是按钮'  # 组件属性参数

3.布局管理

管理组件的大小位置样式

btn.pack()  # 布局管理器,组件的大小位置样式

4.事件

通过与组件绑定,获取组件所触发的事件

def btn_event(obj):  # obj 即事件对象
    print('控制台输出:'+'触发了事件')  # 输出到控制台
btn.bind('<Button-1>', btn_event)  # 事件和组件进行绑定

案例:

from tkinter import *
from tkinter import messagebox

root = Tk()  # 创建窗口

btn = Button(root)  # 创建Button组件,使组件在root窗口展示
btn['text'] = '我是按钮'
btn.pack()  # 布局管理器,配置组件的样式

def btn_event(obj):  # obj 即事件对象
    messagebox.showinfo("Message","触发了事件")  # 弹出新的窗口,并展示内容
    print('控制台输出:'+'触发了事件')  # 输出到控制台

btn.bind('<Button-1>', btn_event)  # 事件绑定,事件和组件进行绑定  <Button-1> :鼠标左键点击一次  <Button-2>:鼠标右键点击一次

if __name__ == '__main__':
    root.mainloop()  # 进入事件循环

主窗口

title('窗口标题')

geometry('wxh ± x, ±y') 

  • w:宽度
  • h:高度
  • +x:距屏幕左边的距离,-x:距屏幕右边的距离
  • +y:距屏幕上边的距离,-y:距;屏幕下边的距离
root.geometry('500x300+100+200')  # 宽度500,高度300,距左边100,距上边200

组件

Toplevel顶层容器类,可为其他组件提供单独的容器,类似窗口
Button按钮按钮点击组件
Ganvas画布提供绘图功能
CheckButton复选框可勾选的复选框
Entry单行输入框可输入内容
Frame容器用于装载其他组件
LabelFrame容器类似Frame,但可以添加标题
label标签显示不可编辑的文本或图标
Listbox列表框可列出多个选项
Menu菜单菜单组件
MenuButton菜单按钮包含菜单的按钮,包括下拉层叠式等
OptionMenuu菜单按钮MenuButton的子类,可通过按钮打开一个菜单
Message消息框可以显示多行文档

Frame容器

GUI编程就是编写一个个组件,界面由组件组成,组件内又可以创建组件,这种组件即为容器

import tkinter as tk
from tkinter import Frame

root = tk.Tk()
root.title('包含容器的GUI')
root.geometry('500x300+200+200')
frame = Frame(master=root)  # 在root中创建容器
frame.pack()

root.mainloop()

经典的面向对象的GUI

import tkinter as tk
from tkinter import *
from tkinter import messagebox

root = tk.Tk()
root.title('经典的面向对象的GUI')
root.geometry('500x300+200+200')

class Application(Frame):
    def __init__(self, master):
        super().__init__(master)

        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        '''创建各种组件'''
        self.btn01 = Button(self, text='容器的按钮01', command=self.btn01_event)  # 创建button组件,在Frame中显示,这里的self是Frame
        self.btn01.pack()

        self.btn02 = Button(self, text='退出', command=root.destroy)
        self.btn02.pack()

    def btn01_event(self):
        messagebox.showinfo('Message', '触发了事件')
        print('控制台输出:' + '触发了事件')  # 输出到控制台


def main():
    app = Application(root)
    root.mainloop()

if __name__ == '__main__':
    main()

 

 Label

  • font:字体和大小,1个中文宽度两个字符,高度一个字符
  • image:图片,目前支持gif
  • fg:前景色,bg:背景色
  • justigy:对齐方式,left、center、right
  • width:宽度,heigth:高度
import tkinter as tk
from tkinter import *
from tkinter import messagebox

root = tk.Tk()
root.title('我是窗口')
root.geometry('500x300+200+200')


class Application(Frame):
    def __init__(self, master):
        super().__init__(master)

        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        '''创建各种组件'''
        # 文件标签
        self.text_label = Label(self, text='label组件',
                           width=10, height=2, bg='black', fg='white', font=('黑体', 15), justify='left', borderwidth=1)
        self.text_label.pack()
        self.text_label2 = Label(self, text='label组件\nlabel组件内容不能修改\n哈哈',
                           bg='black', fg='white', font=('黑体', 15), justify='left', borderwidth=1)
        self.text_label2.pack()
        # 图片标签
        global PHOTO
        PHOTO = PhotoImage(file='img.gif')  # 注意:图片最好是全局变量
        self.photo_label = Label(root, image=PHOTO)
        self.photo_label.pack()


def main():
    app = Application(root)
    root.mainloop()

if __name__ == '__main__':
    main()

 

Button

import tkinter as tk
from tkinter import *
from tkinter import messagebox

root = tk.Tk()
root.title('我是窗口')
root.geometry('500x300+200+200')

PHOTO = PhotoImage(file='img.gif')  # 注意:图片最好是全局变量


class Application(Frame):
    def __init__(self, master):
        super().__init__(master)

        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        '''创建各种组件'''
        self.login_btn = Button(self, text='登录', command=self.login_event)  # 创建button组件,在Frame中显示,这里的self是Frame
        self.login_btn.pack()

        self.image_btn = Button(self, image=PHOTO, command=self.image_event)
        self.image_btn.pack()
        self.image_btn['state'] = 'disable'  # 按钮禁止点击

    def image_event(self):
        messagebox.showinfo('Message', '点击了图片')

    def login_event(self):
        messagebox.showinfo('Message', '登录成功')
        # print('控制台输出:' + '触发了事件')  # 输出到控制台


def main():
    app = Application(root)
    root.mainloop()

if __name__ == '__main__':
    main()

Entry

import tkinter as tk
from tkinter import *
from tkinter import messagebox

root = tk.Tk()
root.title('我是窗口')
root.geometry('500x300+200+200')


class Application(Frame):
    def __init__(self, master):
        super().__init__(master)

        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        '''创建各种组件'''
        self.user_label = Label(self, text='用户')
        self.user_label.pack()

        user_value = StringVar()  # 定义变量,要用来接收Entry输入的值
        user_value.set('admin')  # StringVar 的默认值
        self.user_entry = Entry(self, textvariable=user_value)  # StringVar变量绑定到Entry组件
        self.user_entry.pack()
        print(user_value.get())
        print(self.user_entry.get())

        self.pwd_label = Label(self, text='密码')
        self.pwd_label.pack()
        pwd_value = StringVar()
        self.pwd_entry = Entry(self, textvariable=pwd_value, show="*")  # 用户输入的内容展示成 *
        self.pwd_entry.pack()

        self.user_btn = Button(self, text='提交', command=self.login)
        self.user_btn.pack()

    def login(self):
        print('用户名: ' + self.user_entry.get())  # 获取输入框的值
        print('用户密码: ' + self.pwd_entry.get())  # 获取输入框的值
        messagebox.showinfo('Message', '登录成功')


def main():
    app = Application(root)
    root.mainloop()

if __name__ == '__main__':
    main()


http://www.kler.cn/news/307245.html

相关文章:

  • 物联网智能项目
  • Android Tools | 如何使用Draw.io助力Android开发:从UI设计到流程优化
  • 腾讯云使用
  • 将jar包作为lib导入和maven依赖导入有什么区别?
  • seafaring靶场渗透测试
  • 【C语言】(指针系列2)指针运算+指针与数组的关系+二级指针+指针数组+《剑指offer面试题》
  • 重塑科普展厅魅力,以用户体验为核心的策略性规划新探索!
  • 『功能项目』切换职业面板【48】
  • php部署到apach服务器上遇到的问题
  • 萤石举办2024清洁机器人新品发布会 多维智能再造行业标杆
  • 2024.9.15周报
  • Kubernetes标签与标签选择器
  • 容器技术--Docker应用部署
  • Redis——常用数据类型List
  • C# 入坑JAVA 潜规则 大小写敏感文件名和类名 枚举等 入门系列2
  • 机器学习--神经网络
  • 【裸机装机系列】4.kali(ubuntu)-配置个人用户的sudo权限并进行bashrc的其他配置
  • Qt常用控件——QComboBox
  • Redisson分布式锁实现及原理详解
  • Visual Studio(vs)下载安装C/C++运行环境配置和基本使用注意事项
  • 深度学习之微积分预备知识点
  • HTTP 的请求方式有哪些和有什么区别
  • MATLAB 可视化基础:绘图命令与应用
  • C#笔记8 线程是什么?多线程怎么实现和操作?
  • Python精选200Tips:121-125
  • Spring Boot集成Akka Cluster实现在分布式节点中执行任务
  • Android中如何处理运行时权限?
  • 02 信念·组织力·战略 - 目标管理
  • [OpenCV] 数字图像处理 C++ 学习——15像素重映射(cv::remap) 附完整代码
  • 数据中台建设(六)—— 数据资产管理