-
Tkinter的各种控件的介绍、语法格式、属性说明、常见方法:
可参考文章 Tkinter是什么 (biancheng.net)
-
python tkinter可以使用的颜色
可参考文章
https://blog.csdn.net/u013180459/article/details/82656958
-
messagebox消息对话框
在tkinter中有三种标准对话框:messagebox、filedialog、colorchooser。
三种消息框:
1、消息提示框 showinfo(title, message, options)
2、消息警告框 showwarning(title, message, options)
3、错误消息框 showerror(title, message, options)
五种对话框:
1、询问确认对话框 askquestion(title, message, options)
2、确认/取消对话框 askokcancel(title, message, options)
3、是/否对话框 askyesno(title, message, options)
4、重试/取消对话框 askretrycancel(title, message, options)
5、是/否/取消对话框 askyesnocancel(title, message, options)
参数 | 用法 |
title | 设置消息对话框的标题文本 |
message | 设置消息对话框的主要文本内容,可用’\n’实现换行 |
default | 1. 设置默认的按钮(也就是按下回车响应的那个按钮);2. 默认是第一个按钮(像“确定”,“是”或“重试”);3. 可以设置的值根据对话框函数的不同可以选择:CANCEL,IGNORE,OK,NO,RETRY 或 YES |
icon | 1. 指定对话框显示的图标;2. 可以指定的值有:ERROR,INFO,QUESTION 或 WARNING;3. 注意:不能指定自己的图标 |
parent | 1. 如果不指定该选项,那么对话框默认显示在根窗口上;2. 如果想要将对话框显示在子窗口 w 上,那么可以设置 parent=w |
返回值:
showerror(),showinfo() 和 showwarning() 返回“ok”表示用户按下了“确定”按钮;
askquestion() 返回“yes”或“no”字符串表示用户点击了“是”或“否”按钮;
askokcancel(),askretrycancel() 和 askyesno() 返回布尔类型的值:用户点击了“确定”或“是” 按钮则返回 True,用户点击了“取消”或“否”按钮则返回 False。
例:
from tkinter import *
import tkinter.messagebox
response = requests.post(url=url, data=json.dumps(payload), headers=headers)
if response.status_code != 200:
txt = tkinter.messagebox.showerror(title="提示", message="更新版本信息失败,请检查!")
txt = tkinter.messagebox.showinfo(title="提示", message="更新版本信息成功!")
-
自己练习的示例:
示例1:
# -*- coding:UTF-8 -*-
from tkinter import *
import tkinter.messagebox
import tkinter.ttk as ttk
from PIL import Image,ImageTk,ImageSequence
import time
import requests
import json
if __name__=="__main__":
root=Tk()
root.title("APP版本升级配置工具")
#第一步:选择环境
label1=Label(root,text="1.请选择环境:",font =('微软雅黑',13,"bold"),fg = 'black',width = 12, height = 2,anchor=W)
label1.grid(row=0,column=0,padx = 0,pady = 0)
#新建1个整型变量,来表示中国、美西、欧洲、英国四个环境哪个被勾选
radio_var1 = IntVar()
#设置4个单选框控件,使用variable参数来接收变量
radio1 = Radiobutton(root, text='中国', font =('微软雅黑',13), fg = 'black', width = 8, height = 2,anchor=W,value=1,variable = radio_var1)
radio2 = Radiobutton(root, text='美西', font=('微软雅黑', 13), fg='black', width = 8, height = 2,anchor=W,value=2,variable = radio_var1)
radio3 = Radiobutton(root, text='欧洲', font=('微软雅黑', 13), fg='black', width = 8, height = 2,anchor=W,value=3,variable = radio_var1)
radio4 = Radiobutton(root, text='英国', font=('微软雅黑', 13), fg='black', width = 8, height = 2,anchor=W,value=4,variable = radio_var1)
radio1.grid(row=0,column=1,padx = 0,pady = 0)
radio2.grid(row=0,column=2,padx = 0,pady = 0)
radio3.grid(row=0,column=3,padx = 0,pady = 0)
radio4.grid(row=0, column=4, padx=0, pady=0)
#第二步:选择平台
label2 = Label(root, text="2.请选择平台:", font=('微软雅黑', 13, "bold"), fg='black', width=12, height=2, anchor=W)
label2.grid(row=1, column=0, padx=0, pady=0)
# 新建1个整型变量,来表示android、ios哪个被勾选
radio_var2 = IntVar()
# 设置2个单选框控件,使用variable参数来接收变量
radio5 = Radiobutton(root, text='Android', font=('微软雅黑', 13), fg='black', width=8, height=2, anchor=W, value=1,
variable=radio_var2)
radio6 = Radiobutton(root, text='IOS', font=('微软雅黑', 13), fg='black', width=8, height=2, anchor=W, value=2,
variable=radio_var2)
radio5.grid(row=1, column=1, padx=0, pady=0)
radio6.grid(row=1, column=2, padx=0, pady=0)
#第三步:新建版本配置信息:APP Name、Version、Min Version、AppStore、Type、Scope、Description等
label3 = Label(root, text="3.输入配置信息:", font=('微软雅黑', 13, "bold"), fg='black', width=12, height=2, anchor=W)
label3.grid(row=2, column=0,padx=0, pady=0)
# 输入APP Name
label4 = Label(root, text="*APP Name:", font=('微软雅黑', 13), fg='black', width=13, height=2)
label4.grid(row=3, column=0, padx=0, pady=0)
app_name = Variable()
entry_app_name = Entry(root, textvariable=app_name, bd=3, width=20, justify=LEFT)
entry_app_name.grid(row=3, column=1, columnspan=1, padx=0, pady=0)
# 输入APPID
label5 = Label(root, text="*APPID:", font=('微软雅黑', 13), fg='black', width=13, height=2)
label5.grid(row=3, column=2, padx=0, pady=0)
app_id = Variable()
entry_app_id = Entry(root, textvariable=app_id, bd=3, width=20, justify=LEFT)
entry_app_id.grid(row=3, column=3, columnspan=1, padx=0, pady=0)
# 输入Version
label6 = Label(root, text="Version:", font=('微软雅黑', 13), fg='black', width=13, height=2)
label6.grid(row=4, column=0, padx=0, pady=0)
app_version = Variable()
entry_app_version = Entry(root, textvariable=app_version, bd=3, width=20, justify=LEFT)
entry_app_version.grid(row=4, column=1, columnspan=1, padx=0, pady=0)
# 输入Min Version
label7 = Label(root, text="Min Version:", font=('微软雅黑', 13), fg='black', width=13, height=2)
label7.grid(row=4, column=2, padx=0, pady=0)
app_min_version = Variable()
entry_app_min_version = Entry(root, textvariable=app_min_version, bd=3, width=20, justify=LEFT)
entry_app_min_version.grid(row=4, column=3, columnspan=1, padx=0, pady=0)
# 输入Description
label8 = Label(root, text="Description:", font=('微软雅黑', 13), fg='black', width=13, height=2)
label8.grid(row=5, column=0, padx=0, pady=0)
app_description = Variable()
entry_app_name = Entry(root, textvariable=app_description, bd=3, width=20, justify=LEFT)
entry_app_name.grid(row=5, column=1, columnspan=1, padx=0, pady=0)
# 选择Scope,默认选中FullRelease,创建下拉菜单
label9 = Label(root, text="Scope:", font=('微软雅黑', 13), fg='black', width=13, height=2)
label9.grid(row=5, column=2, padx=0, pady=0)
cbox = ttk.Combobox(root,width=18, justify=LEFT)
cbox.grid(row=5, column=3,)
cbox['value'] = ('Full release', 'Whitelist release')
cbox.current(0)
#安卓版本配置,需上传升级包,IOS版本配置,需输入AppStore链接
label10 = Label(root, text="APK/AppStore路径:", font=('微软雅黑', 13), fg='black', width=15, height=2)
label10.grid(row=6, column=0, padx=0, pady=0)
app_apk = Variable()
entry_app_apk = Entry(root, textvariable=app_apk, bd=3, width=40, justify=LEFT)
entry_app_apk.grid(row=6, column=1, columnspan=2, padx=0, pady=0)
#第四步:操作:保存配置、上架、下架
env_list = ["中国", "美西", "欧洲", "英国"]
platform_list = ["android", "ios"]
login_base_url_list = ["https://***.cn",
"http://***.com",
"https://***.com",
"https://***.com"]
app_version_manager_base_url_list = ['https://***/api/app-version-manager',
'https://***/api/app-version-manager',
'https://***/api/app-version-manager',
'https://***/api/app-version-manager']
label11 = Label(root, text="4.上/下架操作:", font=('微软雅黑', 13, "bold"), fg='black', width=12, height=2, anchor=W)
label11.grid(row=7, column=0, padx=0, pady=0)
save_btn = Button(root, text='更新配置', fg='black', font=('微软雅黑', 13), width=8, height=1,command = lambda: save_version_config())
save_btn.grid(row=7, column=1)
on_btn = Button(root, text='上架', fg='black', font=('微软雅黑', 13), width=8, height=1,command = lambda: on_and_off("on"))
on_btn.grid(row=7, column=2)
off_btn= Button(root, text='下架', fg='black', font=('微软雅黑', 13), width=8, height=1,command = lambda: on_and_off("off"))
off_btn.grid(row=7, column=3)
root.mainloop()
示例2:一个窗口设置两个tab
root=Tk()
root.title("...APP版本配置工具")
#root.geometry("600x500-10+10")
tab_main = ttk.Notebook() # 创建分页栏
tab_main.grid(row=0, column=0, padx=0, pady=0)
tab1 = Frame(tab_main) # 创建第一页框架
tab1.grid(row=0, column=0, padx=0, pady=0)
tab_main.add(tab1, text='Android版本配置')
tab2 = Frame(tab_main) # 创建第二页框架
tab2.grid(row=0, column=0, padx=0, pady=0)
tab_main.add(tab2, text='IOS版本配置')
tab_list=[tab1,tab2]
示例3:显示动图
if __name__=="__main__":
root=Tk()
root.title("你该休息啦!")
root.geometry("500x90-10+10")
label1=Label(root,text="站起来动一动,喝杯水吧!",font =('Arial Rounded MT Bold',25,"bold"),fg = 'DeepPink', bg = 'Gold', width = 20, height = 2)
label1.grid(row=0,column=1,padx = 0,pady = 0)
canvas1 = Canvas(root, width=85, height=90, bg='white')
canvas1.grid(row=0, column=0, padx=0, pady=0)
root.after(5000, root.destroy)
while True:
photo1=Image.open("C:/Users/X20232/Desktop/休息提醒/imo1.gif")
iter = ImageSequence.Iterator(photo1)
for frame in iter:
pic = ImageTk.PhotoImage(frame)
canvas1.create_image((45, 48), image=pic)
time.sleep(0.1)
root.update_idletasks() # 刷新
root.update()
root.mainloop()
示例4:下拉选择框、csv文件读取、写入
# -*- coding:UTF-8 -*-
from tkinter import *
import tkinter.messagebox
import tkinter.ttk as ttk
from PIL import Image,ImageTk,ImageSequence
import time
import requests
import json
import csv
import os
a*l_token=None
def A*l_login(event):
token=None
env=cbox1.get()
print("env=%s"%env)
if env !='':
login_url="/api/base-uc-app/portal/login"
if env == env_list[0]:
url=login_base_url_list[0]+login_url
account="***"
password="test2021"
if env == env_list[1]:
url = login_base_url_list[1] + login_url
account = "***"
password = "test2021"
if env == env_list[2]:
url = login_base_url_list[2] + login_url
account = "***"
password = "test2021"
if env == env_list[3]:
url = login_base_url_list[3] + login_url
account = "***"
password = "test2021"
headers = {
"Accept": "application/json, text/plain, */*",
"Content-Type": "application/json;charset=UTF-8",}
payload={"password": password, "account": account, "loginFrom": "WEB"}
response = requests.post(url=url,headers=headers,data=json.dumps(payload))
print(response)
if response.status_code != 200:
txt = tkinter.messagebox.showerror(title="提示", message="%s环境登录失败,请检查环境或账号信息!"%var1.get())
print("%s环境登录成功"%var1.get())
token = response.json()['data']['token']
a*l_token=token
print("a*l_token=%s"%token)
return
def a*l_location_service():
token = a*l_token
env = cbox1.get()
print("env=%s" % env)
if env=='':
txt = tkinter.messagebox.showerror(title="提示", message="A**位置解析请选择环境!")
if csv_entry.get() == '':
txt = tkinter.messagebox.showerror(title="提示", message="请输入设备经纬度信息csv文件路径!")
print(csv_entry.get())
file1=open(csv_entry.get().split("\n")[0],'r')
csv_file=csv.reader(file1)
success = []
for r in csv_file:
print(r)
if r[0]=="SN":
continue
serial_no=r[0]
latitude=r[1]
longitude=r[2]
location_url = "/api/device/product/bind-gps/"+serial_no
if env == env_list[0]:
url = login_base_url_list[0] + location_url
if env == env_list[1]:
url = login_base_url_list[1] + location_url
if env == env_list[2]:
url = login_base_url_list[2] + location_url
if env == env_list[3]:
url = login_base_url_list[3] + location_url
headers = {
"Accept": "application/json, text/plain, */*",
"Content-Type": "application/json;charset=UTF-8",
"autel-token":token
}
payload = {"lat": float(latitude),
"lon": float(longitude)
}
response = requests.post(url=url, headers=headers, data=json.dumps(payload))
print(response)
if response.status_code != 200:
print("SN号为%s的设备位置解析失败!"%serial_no)
outcome1.insert(tkinter.END, ('SN%s,返回码:%d'%(serial_no,response.status_code)))
outcome1.insert(tkinter.END, '\n')
else:
print("SN号为%s的设备位置解析成功!"%serial_no)
country = response.json()['data']['country']
level_1 = response.json()['data']['level_1']
level_2 = response.json()['data']['level_2']
level_3 = response.json()['data']['level_3']
outcome1.insert(tkinter.END, ('SN:%s,country:%s,level_1:%s,level_2:%s,level_3:%s'%(serial_no,country,level_1,level_2,level_3)))
outcome1.insert(tkinter.END, '\n')
success.append([serial_no, country, level_1, level_2,level_3])
file1.close()
print("解析完成,将结果写入csv文件中")
outcome_file_path = os.path.dirname(csv_entry.get()) + '\\A**位置解析结果.csv'
print(outcome_file_path)
file2 = open(outcome_file_path, 'w', newline="")
outcome_file = csv.writer(file2)
outcome_file.writerow(["SN", "country", "level_1", "level_2","level_3"])
for s in success:
outcome_file.writerow([s])
file2.close()
return
def tencent_location_service():
if csv_entry.get() == '':
txt = tkinter.messagebox.showerror(title="提示", message="请输入设备经纬度信息csv文件路径!")
print(csv_entry.get())
file1 = open(csv_entry.get().split("\n")[0], 'r')
csv_file = csv.reader(file1)
success=[]
i=1
for r in csv_file:
print(r)
if r[0]=="SN":
continue
serial_no = r[0]
latitude = r[1]
longitude = r[2]
location_url = "https://apis.map.qq.com/ws/geocoder/v1?key=5Q5BZ-5EVWJ-SN5F3-K6QBZ-B3FAO-RVBWM&location="+str(latitude)+","+str(longitude)+"&sig=90da272bfa19122547298e2b0bcc0e50"
headers = {
"Accept": "application/json, text/plain, */*",
"Content-Type": "application/json;charset=UTF-8",
}
response = requests.get(url=location_url, headers=headers)
print(response)
if response.status_code != 200:
print("SN号为%s的设备位置解析失败!" % serial_no)
outcome2.insert(tkinter.END, ('SN%s,返回码:%d' % (serial_no, response.status_code)))
outcome2.insert(tkinter.END, '\n')
else:
print("SN号为%s的设备位置解析成功!" % serial_no)
print(response.json())
country = response.json()["result"]['address_component']["nation"]
print("22",country)
if (response.json()["result"]['address_component']).__contains__("province") is True:
province = response.json()['result']['address_component']["province"]
city = response.json()['result']['address_component']["city"]
county = response.json()['result']['address_component']["district"]
else:
province = response.json()['result']['address_component']["ad_level_1"]
city = response.json()['result']['address_component']["ad_level_2"]
county = response.json()['result']['address_component']["ad_level_3"]
outcome2.insert(tkinter.END, ('SN:%s,country:%s,province:%s,city:%s,county:%s' % (serial_no, country, province, city,county)))
outcome2.insert(tkinter.END,'\n')
success.append([serial_no, country, province, city, county])
i+=1
#腾讯位置解析接口一个key每秒请求量只有10个
if i%10==0:
time.sleep(1)
file1.close()
print("解析完成,将结果写入csv文件中")
outcome_file_path = os.path.dirname(csv_entry.get()) + '\\腾讯位置解析结果.csv'
print(outcome_file_path)
file2=open(outcome_file_path, 'w', newline="")
outcome_file = csv.writer(file2)
outcome_file.writerow(["SN", "country", "province", "city", "county"])
for s in success:
outcome_file.writerow([s])
file2.close()
return
if __name__=="__main__":
root=Tk()
root.title("根据经纬度查询位置工具")
root.geometry("590x430-10+10")
#第一步:A**l位置解析需选择环境
label1=Label(root,text="A**位置解析请选择环境:",font =('微软雅黑',11),fg = 'black',width = 22, height = 2,anchor=W)
label1.grid(row=0,column=0,padx = 0,pady = 0)
#创建一个变量,用来表示中国、美西、欧洲、英国哪个环境被选择
var1=tkinter.StringVar()
#创建下拉菜单,包含中国、美西、欧洲、英国四个环境
cbox1=ttk.Combobox(root,textvariable=var1,width=15,justify=LEFT)
# 设置下拉菜单中的值
cbox1['value'] = ('中国', '美西', '欧洲', '英国')
# 绑定下拉菜单事件
env_list = ["中国", "美西", "欧洲", "英国"]
login_base_url_list = ["https://***.cn",
"https://***.com",
"https://***.com",
"https://***.com"]
cbox1.bind("<<ComboboxSelected>>", A**l_login)
cbox1.grid(row=0, column=1, padx=0, pady=0)
#第二步:输入设备经纬度信息csv文件路径
label2 = Label(root, text="设备经纬度csv文件路径:", font=('微软雅黑',11), fg='black', width=22, height=2,anchor=W)
label2.grid(row=1, column=0, padx=0, pady=0)
var2= Variable()
csv_entry = Entry(root, textvariable=var2, bd=3, width=38, justify=LEFT)
csv_entry.grid(row=1, column=1, columnspan=2,padx=0, pady=0,sticky = W)
#第三步:点击按钮执行A**位置解析或腾讯位置解析,以及数据导出按钮
autel_btn = Button(root, text='A**位置解析', fg='black', font=('微软雅黑', 11), width=12, height=1, command=lambda: a*l_location_service())
autel_btn.grid(row=2, column=0)
tencent_btn = Button(root, text='腾讯位置解析', fg='black', font=('微软雅黑', 11), width=12, height=1,command=lambda: tencent_location_service())
tencent_btn.grid(row=2, column=2)
#第四步:解析结果展示
outcome1= Text(root, height=20, width=35)
outcome1.grid(row=3, column=0,columnspan=2,sticky = W)
outcome2 = Text(root, height=20, width=35)
outcome2.grid(row=3, column=2,columnspan=2,sticky = W)
label4 = Label(root, text="A**解析结果展示", font=('微软雅黑', 8), fg='black', width=22, height=2)
label4.grid(row=4, column=0, padx=0, pady=0)
label5 = Label(root, text="腾讯解析结果展示", font=('微软雅黑', 8), fg='black', width=22, height=2)
label5.grid(row=4, column=2, padx=0, pady=0)
root.mainloop()