python Tkinter模块使用方法详解


Posted in Python onApril 07, 2022
目录

一、前言

1.1、Tkinter是什么

Tkinter 是使用 python 进行窗口视窗设计的模块。Tkinter模块(“Tk 接口”)是Python的标准Tk GUI工具包的接口。作为 python 特定的GUI界面,是一个图像的窗口,tkinter是python自带的,可以编辑的GUI界面,用来入门,熟悉窗口视窗的使用,非常有必要。

二、准备工作

2.1、Windows演示环境搭建

  • 安装python3.7
  • 安装编辑器,演示使用的Visual Studio Code

三、Tkinter创建窗口

3.1、创建出一个窗口

首先我们导入tkinter的库

import tkinter as tk  # 在代码里面导入库,起一个别名,以后代码里面就用这个别名
root = tk.Tk()  # 这个库里面有Tk()这个方法,这个方法的作用就是创建一个窗口

如果只是执行以上的两句代码,运行程序是没有反应的,因为只有一个主函数,从上到下执行完就没有了,这个窗口也是很快就消失了,所以现在我们要做的就是让窗口一直显示,那么我们就可以加一个循环

创建的窗口的名字是root ,那么我们之后使用这个root就可以操作这个窗口了。

root.mainloop()  # 加上这一句,就可以看见窗口了

执行以上的3句代码,我们就可以看见窗口了

python Tkinter模块使用方法详解

3.2、给窗口取一个标题

root.title('演示窗口')

python Tkinter模块使用方法详解

3.3、窗口设置

通过以下代码,我们可以给窗口设置长宽以及窗口在屏幕的位置

root.geometry("300x100+630+80")  # 长x宽+x*y

python Tkinter模块使用方法详解

3.3、创建按钮,并且给按钮添加点击事件

这个库里面有一个方法Button(),只要调用这个方法,我们就可以创建这个组件,创建的这个组件我们赋值给一个常量,以后我们就可以用这个常量来操作这个按钮,这个方法里面的参数,就是要我们写窗口的名字

Button(root) 这样写的意思就是 将我们创建的按钮放到这个窗口上面

btn1 = tk.Button(root)

给按钮取一个名称

btn1["text"] = "点击"

我们创建的按钮组件,已经放到窗口里面了,但是放到窗口的哪个位置,东南西北哪个地方,我们就可以用pack()去定位(后面会介绍其它定位方法)

btn1.pack()  # 按钮在窗口里面的定位

创建点击按钮事件的弹窗,先导入messagebox,这个必须单独导入

from tkinter import messagebox
def test(e):
    messagebox.showinfo("窗口名称","点击成功")

现在有了按钮,有了方法,我想要做的是一点击按钮,就执行这个方法,那么就需要将按钮和方法进行绑定

btn1.bind("<Button-1>",test) #第一个参数为:按鼠标左键的事件 第二个参数为:要执行的方法的名字

按钮组件里面有一个方法bind() 这个方法就可以实现绑定

完整代码

import tkinter as tk
from tkinter import messagebox
root = tk.Tk()  # 创建窗口
root.title('演示窗口')
root.geometry("300x100+630+80")  # 长x宽+x*y

btn1 = tk.Button(root)  # 创建按钮,并且将按钮放到窗口里面
btn1["text"] = "点击"  # 给按钮一个名称
btn1.pack()  # 按钮布局

def test(e):
    '''创建弹窗'''
    messagebox.showinfo("窗口名称", "点击成功")

btn1.bind("<Button-1>", test)  # 将按钮和方法进行绑定,也就是创建了一个事件
root.mainloop()  # 让窗口一直显示,循环

python Tkinter模块使用方法详解

3.4、窗口内的组件布局

3种布局管理器:pack - grid - place

pack 
这个布局管理器,要么将组件垂直的排列,要么水平的排列

grid 
Grid(网格)布局管理器会将控件放置到一个二维的表格里。
主控件被分割成一系列的行和列,表格中的每个单元(cell)都可以放置一个控件。

选项 说明
column 单元格的列号,从0开始的正整数
columnspan 跨列,跨越的列数,正整数
row 单元格的行号, 从0开始的正整数
rowspan 跨行,跨越的行数,正整数
ipadx, ipady 设置子组件之间的间隔,x方向或y方向,默认单位为像素,非浮点数,默认0.0
padx, pady 与之并列的组件之间的间隔,x方向或y方向,默认单位为像素,非浮点数,默认0.0
sticky 组件紧贴所在的单元格的某一脚,对应于东南西北中以及4个角。东 = “e”,南=“s”,西=“w”,北=“n”,“ne”,“se”,“sw”, “nw”;

grid_info() 查看组件默认的参数

import tkinter as tk
root = tk.Tk()

# 默认按钮
btn1 = tk.Button(root)
btn1["text"] = "按钮1"
btn1.grid()
print(btn1.grid_info())

root.title('演示窗口')
root.geometry("300x150+1000+300")
root.mainloop()

python Tkinter模块使用方法详解

column 指定控件所在的列

import tkinter as tk
root = tk.Tk()

# 按钮1
btn1 = tk.Button(root)
btn1["text"] = "按钮1"
btn1.grid(column=0)

# 按钮2
btn2 = tk.Button(root)
btn2["text"] = "按钮2"
btn2.grid(column=1)


root.title('演示窗口')
root.geometry("300x100+1000+300")
root.mainloop()

python Tkinter模块使用方法详解

  • columnspan 指定每个控件横跨的列数
  • 什么是columnspan?

类似excel的合并单元格

python Tkinter模块使用方法详解

a占了两个格子的宽度,colunmspan就是2

```python
import tkinter as tk
root = tk.Tk()

# 按钮1
btn1 = tk.Button(root)
btn1["text"] = "按钮1"
btn1.grid(column=0, columnspan=2)

# 按钮2
btn2 = tk.Button(root)
btn2["text"] = "按钮2"
btn2.grid(column=1, columnspan=1)


root.title('演示窗口')
root.geometry("300x100+1000+300")
root.mainloop()

python Tkinter模块使用方法详解

row 指定控件所在的行

import tkinter as tk
root = tk.Tk()

# 按钮1
btn1 = tk.Button(root)
btn1["text"] = "按钮1"
btn1.grid(row=0)

# 按钮2
btn2 = tk.Button(root)
btn2["text"] = "按钮2"
btn2.grid(row=1)

# 按钮3
btn3 = tk.Button(root)
btn3["text"] = "按钮2"
btn3.grid(row=2)


root.title('演示窗口')
root.geometry("300x100+1000+300")
root.mainloop()

python Tkinter模块使用方法详解

  • rowspan 指定每个控件横跨的行数
  • 什么是rowspan ?

类似excel的合并单元格

python Tkinter模块使用方法详解

a占了两个格子的高度,rowspan就是2

import tkinter as tk
root = tk.Tk()

# 按钮1
btn1 = tk.Button(root)
btn1["text"] = "按钮1"
btn1.grid(row=0, rowspan=2)

# 按钮2
btn2 = tk.Button(root)
btn2["text"] = "按钮2"
btn2.grid(row=2, rowspan=1)

root.title('演示窗口')
root.geometry("300x100+1000+300")
root.mainloop()

python Tkinter模块使用方法详解

ipadx 水平方向内边距

import tkinter as tk
root = tk.Tk()

# 按钮1
btn1 = tk.Button(root)
btn1["text"] = "按钮1"
btn1.grid(ipadx=20)

# 按钮2
btn2 = tk.Button(root)
btn2["text"] = "按钮2"
btn2.grid(ipadx=5)

root.title('演示窗口')
root.geometry("300x100+1000+300")
root.mainloop()

python Tkinter模块使用方法详解

ipady 垂直方向内边距

import tkinter as tk
root = tk.Tk()

# 按钮1
btn1 = tk.Button(root)
btn1["text"] = "按钮1"
btn1.grid(ipady=20)

# 按钮2
btn2 = tk.Button(root)
btn2["text"] = "按钮2"
btn2.grid(ipady=5)

root.title('演示窗口')
root.geometry("300x150+1000+300")
root.mainloop()

python Tkinter模块使用方法详解

padx 水平方向外边距

import tkinter as tk
root = tk.Tk()

# 按钮1
btn1 = tk.Button(root)
btn1["text"] = "按钮1"
btn1.grid(padx=50)

# 按钮2
btn2 = tk.Button(root)
btn2["text"] = "按钮2"
btn2.grid(column=1, padx=20)

root.title('演示窗口')
root.geometry("300x150+1000+300")
root.mainloop()

python Tkinter模块使用方法详解

pady 垂直方向外边距

import tkinter as tk
root = tk.Tk()

# 按钮1
btn1 = tk.Button(root)
btn1["text"] = "按钮1"
btn1.grid(pady=30)

# 按钮2
btn2 = tk.Button(root)
btn2["text"] = "按钮2"
btn2.grid(pady=20)

root.title('演示窗口')
root.geometry("300x150+1000+300")
root.mainloop()

python Tkinter模块使用方法详解

sticky 组件东南西北的方向

import tkinter as tk
root = tk.Tk()

# 默认按钮
btn1 = tk.Button(root)
btn1["text"] = "默认按钮演示效果"
btn1.grid(ipadx=50)

# 按钮2
btn2 = tk.Button(root)
btn2["text"] = "按钮2"
btn2.grid(row=1, sticky="w")

# 按钮3
btn3 = tk.Button(root)
btn3["text"] = "按钮3"
btn3.grid(row=1, sticky="e")

root.title('演示窗口')
root.geometry("300x150+1000+300")
root.mainloop()

python Tkinter模块使用方法详解

place布局管理器
place布局管理器可以通过坐标精确控制组件的位置,适用于一些布局更加灵活的场景

选项 说明
x,y 组件左上角的绝对坐标(相当于窗口)
relx ,rely 组件左上角的坐标(相对于父容器)
width , height 组件的宽度和高度
relwidth , relheight 组件的宽度和高度(相对于父容器)
anchor 对齐方式,左对齐“w”,右对齐“e”,顶对齐“n”,底对齐“s”
import tkinter as tk
root = tk.Tk()

but1 = tk.Button(root, text="按钮1")
but1.place(relx=0.2, x=100, y=20, relwidth=0.2, relheight=0.5)

root.title('演示窗口')
root.geometry("300x150+1000+300")
root.mainloop()

python Tkinter模块使用方法详解

四、Tkinter基本控件介绍

4.1、封装

import tkinter as tk

class GUI:

    def __init__(self):
        self.root = tk.Tk()
        self.root.title('演示窗口')
        self.root.geometry("500x200+1100+150")
        self.interface()

    def interface(self):
        """"界面编写位置"""
        pass

if __name__ == '__main__':
    a = GUI()
    a.root.mainloop()

4.2、文本显示_Label

def interface(self):
        """"界面编写位置"""
        self.Label0 = tk.Label(self.root, text="文本显示")
        self.Label0.grid(row=0, column=0)

4.3、按钮显示_Button

def interface(self):
        """"界面编写位置"""
        self.Button0 = tk.Button(self.root, text="按钮显示")
        self.Button0.grid(row=0, column=0)

4.4、输入框显示_Entry

def interface(self):
        """"界面编写位置"""
        self.Entry0 = tk.Entry(self.root)
        self.Entry0.grid(row=0, column=0)

4.5、文本输入框显示_Text

# pack布局
    def interface(self):
        """"界面编写位置"""
        self.w1 = tk.Text(self.root, width=80, height=10)
        self.w1.pack(pady=0, padx=30)
# grid布局
    def interface(self):
        """"界面编写位置"""
        self.w1 = tk.Text(self.root, width=80, height=10)
        self.w1.grid(row=1, column=0)

4.6、复选按钮_Checkbutton

def interface(self):
        """"界面编写位置"""
        self.Checkbutton01 = tk.Checkbutton(self.root, text="名称")
        self.Checkbutton01.grid(row=0, column=2)

4.7、单选按钮_Radiobutton

def interface(self):
        """"界面编写位置"""
        self.Radiobutton01 = tk.Radiobutton(self.root, text="名称")
        self.Radiobutton01.grid(row=0, column=2)

五、组件使用方法介绍

5.1、按钮(Button)绑定事件

def interface(self):
        """"界面编写位置"""
        self.Button0 = tk.Button(self.root, text="运行", command=self.event)
        self.Button0.grid(row=0, column=0)
        
		self.Button1 = tk.Button(self.root, text="退出", command=self.root.destroy, bg="Gray")  # bg=颜色
        self.Button1.grid(row=0, column=1, sticky="e", ipadx=10)

    def event(self):
        """按钮事件"""
        print("运行成功")

5.2、输入框(Entry)内容获取

def interface(self):
        """"界面编写位置"""
        self.entry00 = tk.StringVar()
        self.entry00.set("默认信息")

        self.entry0 = tk.Entry(self.root, textvariable=self.entry00)
        self.entry0.grid(row=1, column=0)

        self.Button0 = tk.Button(self.root, text="运行", command=self.event)
        self.Button0.grid(row=0, column=0)

    def event(self):
        """按钮事件,获取文本信息"""
        a = self.entry00.get()
        print(a)

5.2、文本输入框(Text),写入文本信息和清除文本信息

def interface(self):
        """"界面编写位置"""
        self.Button0 = tk.Button(self.root, text="清除", command=self.event)
        self.Button0.grid(row=0, column=0)

        self.w1 = tk.Text(self.root, width=80, height=10)
        self.w1.grid(row=1, column=0)
        self.w1.insert("insert", "默认信息")

    def event(self):
        '''清空输入框'''
        self.w1.delete(1.0, "end")

5.3、获取复选按钮(Checkbutton)的状态

def interface(self):
        """"界面编写位置"""
        self.Button0 = tk.Button(self.root, text="确定", command=self.event)
        self.Button0.grid(row=0, column=0)

        self.v1 = tk.IntVar()
        self.Checkbutton01 = tk.Checkbutton(self.root, text="复选框", command=self.Check_box, variable=self.v1)
        self.Checkbutton01.grid(row=1, column=0)

        self.w1 = tk.Text(self.root, width=80, height=10)
        self.w1.grid(row=2, column=0)

    def event(self):
        '''按钮事件,获取复选框的状态,1表示勾选,0表示未勾选'''
        a = self.v1.get()
        self.w1.insert(1.0, str(a)+'\n')

    def Check_box(self):
        '''复选框事件'''
        if self.v1.get() == 1:
            self.w1.insert(1.0, "勾选"+'\n')
        else:
            self.w1.insert(1.0, "未勾选"+'\n')

5.4、清除控件

def interface(self):
        """"界面编写位置"""
        self.Button0 = tk.Button(self.root, text="确定", command=self.event)
        self.Button0.grid(row=0, column=0)

        self.Label0 = tk.Label(self.root, text="文本显示")
        self.Label0.grid(row=1, column=0)

        self.Entry0 = tk.Entry(self.root)
        self.Entry0.grid(row=2, column=0)

        self.w1 = tk.Text(self.root, width=80, height=10)
        self.w1.grid(row=3, column=0)

    def event(self):
        '''按钮事件,清除Label、Entry、Text组件'''
        a = [self.Label0, self.Entry0, self.w1]
        for i in a:
            i.grid_forget()

5.5、清除复选框勾选状态

def interface(self):
        """"界面编写位置"""
        self.Button0 = tk.Button(self.root, text="确定", command=self.event)
        self.Button0.grid(row=0, column=0)

        self.v1 = tk.IntVar()
        self.Checkbutton01 = tk.Checkbutton(self.root, text="复选框", command=self.Check_box, variable=self.v1)
        self.Checkbutton01.grid(row=1, column=0)

        self.w1 = tk.Text(self.root, width=80, height=10)
        self.w1.grid(row=2, column=0)

    def event(self):
        '''按钮事件,清除复选框勾选状态'''
        self.Checkbutton01.deselect()

    def Check_box(self):
        '''复选框事件'''
        if self.v1.get() == 1:
            self.w1.insert(1.0, "勾选"+'\n')
        else:
            self.w1.insert(1.0, "未勾选"+'\n')

5.6、文本框(Text)内容获取

def interface(self):
        """"界面编写位置"""
        self.Button0 = tk.Button(self.root, text="确定", command=self.event)
        self.Button0.grid(row=0, column=0)

        self.w1 = tk.Text(self.root, width=80, height=10)
        self.w1.grid(row=1, column=0)

    def event(self):
        a = self.w1.get('0.0', 'end')
        print(a)

六、Tkinter使用多线程

6.1、为什么要使用多线程

以下为单线程运行

def interface(self):
        """"界面编写位置"""
        self.Button0 = tk.Button(self.root, text="确定", command=self.event)
        self.Button0.grid(row=0, column=0)

        self.w1 = tk.Text(self.root, width=80, height=10)
        self.w1.grid(row=1, column=0)

    def event(self):
        '''按钮事件,一直循环'''
        a = 0
        while True:
            a += 1
            self.w1.insert(1.0, str(a)+'\n')

单线程下,主线程需要运行窗口,如果这个时候点击“确定”按钮,主线程就会去执行event方法,那界面就会出现“无响应”状态,如果要界面正常显示,那我们就需要用到多线程(threading)

python Tkinter模块使用方法详解

多线程,完整代码

import tkinter as tk
import threading  # 导入多线程模块

class GUI:

    def __init__(self):
        self.root = tk.Tk()
        self.root.title('演示窗口')
        self.root.geometry("500x200+1100+150")
        self.interface()

    def interface(self):
        """"界面编写位置"""
        self.Button0 = tk.Button(self.root, text="确定", command=self.start)
        self.Button0.grid(row=0, column=0)

        self.w1 = tk.Text(self.root, width=80, height=10)
        self.w1.grid(row=1, column=0)

    def event(self):
        '''按钮事件,一直循环'''
        a = 0
        while True:
            a += 1
            self.w1.insert(1.0, str(a)+'\n')

    def start(self):
        self.T = threading.Thread(target=self.event)  # 多线程
        self.T.setDaemon(True)  # 线程守护,即主进程结束后,此线程也结束。否则主进程结束子进程不结束
        self.T.start()  # 启动

if __name__ == '__main__':
    a = GUI()
    a.root.mainloop()

python Tkinter模块使用方法详解

七、Tkinter多线程暂停和继续

import tkinter as tk
import threading
from time import sleep

event = threading.Event()

class GUI:

    def __init__(self):
        self.root = tk.Tk()
        self.root.title('演示窗口')
        self.root.geometry("500x200+1100+150")
        self.interface()

    def interface(self):
        """"界面编写位置"""
        self.Button0 = tk.Button(self.root, text="启动", command=self.start)
        self.Button0.grid(row=0, column=0)

        self.Button0 = tk.Button(self.root, text="暂停", command=self.stop)
        self.Button0.grid(row=0, column=1)

        self.Button0 = tk.Button(self.root, text="继续", command=self.conti)
        self.Button0.grid(row=0, column=2)

        self.w1 = tk.Text(self.root, width=70, height=10)
        self.w1.grid(row=1, column=0, columnspan=3)

    def event(self):
        '''按钮事件,一直循环'''
        while True:
            sleep(1)
            event.wait()
            self.w1.insert(1.0, '运行中'+'\n')

    def start(self):
        event.set()
        self.T = threading.Thread(target=self.event)
        self.T.setDaemon(True)
        self.T.start()

    def stop(self):
        event.clear()
        self.w1.insert(1.0, '暂停'+'\n')

    def conti(self):
        event.set()
        self.w1.insert(1.0, '继续'+'\n')

if __name__ == '__main__':
    a = GUI()
    a.root.mainloop()

八、Tkinter文件之间的调用

8.1、准备工作

  • a.py文件 - -界面逻辑+线程
  • b.py 文件 - -业务逻辑
  • 以上文件在同一个目录下

8.2、方法

# a.py 文件
import tkinter as tk
import threading
from b import logic  # 调用b文件中的logic类

class GUI:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title('演示窗口')
        self.root.geometry("500x260+1100+150")
        self.interface()

    def interface(self):
        """"界面编写位置"""
        self.Button0 = tk.Button(self.root, text="确定执行", command=self.start, bg="#7bbfea")
        self.Button0.grid(row=0, column=1, pady=10)

        self.entry00 = tk.StringVar()
        self.entry00.set("")

        self.entry0 = tk.Entry(self.root, textvariable=self.entry00)
        self.entry0.grid(row=1, column=1, pady=15)

        self.w1 = tk.Text(self.root, width=50, height=8)
        self.w1.grid(row=2, column=0, columnspan=3, padx=60)

    def seal(self):
        '''把b文件的类单独写一个方法'''
        a = self.entry00.get()
        w1 = self.w1
        logic().event(a, w1)

    def start(self):
        '''子线程无法直接执行b的类,需要把b文件单独写一个方法,然后执行'''
        self.T = threading.Thread(target=self.seal)
        self.T.setDaemon(True)
        self.T.start()

if __name__ == '__main__':
    a = GUI()
    a.root.mainloop()
# b.py 文件
import time
class logic():
    def __init__(self):
        pass

    def main(self, a, x):
        while True:
            y = int(a)+int(x)
            self.w1.insert(1.0, str(y)+'\n')
            time.sleep(1)
            x += 1

    def event(self, a, w1):
        '''调用main的方法'''
        self.w1 = w1
        x = 1
        self.main(a, x)

总结

到此这篇关于python Tkinter模块使用的文章就介绍到这了,更多相关python Tkinter使用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python使用urllib模块的urlopen超时问题解决方法
Nov 08 Python
django数据库migrate失败的解决方法解析
Feb 08 Python
python奇偶行分开存储实现代码
Mar 19 Python
Python爬虫实现爬取百度百科词条功能实例
Apr 05 Python
python提取照片坐标信息的实例代码
Aug 14 Python
利用Python校准本地时间的方法教程
Oct 31 Python
使用PyCharm进行远程开发和调试的实现
Nov 04 Python
tensorflow pb to tflite 精度下降详解
May 25 Python
python实现扫雷游戏的示例
Oct 20 Python
python递归函数用法详解
Oct 26 Python
基于 Python 实践感知器分类算法
Jan 07 Python
用Python将库打包发布到pypi
Apr 13 Python
一行Python命令实现批量加水印
Apr 07 #Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
详解Python中*args和**kwargs的使用
Apr 07 #Python
Python列表的索引与切片
Apr 07 #Python
Python字符串的转义字符
Python字符串格式化方式
Apr 07 #Python
Python中re模块的元字符使用小结
You might like
无限级别菜单的实现
2006/10/09 PHP
Symfony2开发之控制器用法实例分析
2016/02/05 PHP
laravel实现按月或天或小时统计mysql数据的方法
2019/10/09 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
有关suggest快速删除后仍然出现下拉列表的bug问题
2016/12/02 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
2017/02/08 Javascript
原生JavaScrpit中异步请求Ajax实现方法
2017/11/03 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
2017/12/14 Javascript
Vue cli构建及项目打包以及出现的问题解决
2018/08/27 Javascript
VUE-cli3使用 svg-sprite-loader
2018/10/20 Javascript
微信小程序实现弹出层效果
2020/05/26 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
2018/11/26 Javascript
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
2020/02/05 Javascript
Python使用Tkinter实现机器人走迷宫
2018/01/22 Python
python实现图片识别汽车功能
2018/11/30 Python
python的sorted用法详解
2019/06/25 Python
Python正则表达式匹配日期与时间的方法
2019/07/07 Python
Python OpenCV调用摄像头检测人脸并截图
2020/08/20 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
2019/08/30 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
法国大使拉杆箱官网:DELSEY Paris
2018/03/20 全球购物
C# Debug和Testing相关面试题
2015/10/25 面试题
自我推荐书
2013/12/04 职场文书
小学生节约用水倡议书
2014/05/15 职场文书
条幅标语大全
2014/06/20 职场文书
2016年教师寒假学习心得体会
2015/10/09 职场文书
写好求职信的技巧解密
2019/05/14 职场文书
golang import自定义包方式
2021/04/29 Golang
PHP实现两种排课方式
2021/06/26 PHP
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python