通过tkinter做一个简单的ui,输入关键字,查到对应结果(需要绑定后台查询方法)
界面使用按钮Button、输入框Entry、展示控件Label(可展示文字或图片)以及容器Frame。其中Frame可作为父控件容纳其他控件,示例中使用Frame包裹了两个Entry和Label,主要是为了优化pack()自适应排版问题。在默认情况下,自适应排版会从竖直中心线,从上往下排列(如下图)
单个控件可以通过side和padx调整位置,但多个控件在自适应模式下,如示例中两个文字Label,两个输入框Entry,则难以调整到想要的布局,
通过Frame包裹则能比较好的解决此问题
# -*- coding=utf-8 -*-
# ui_main.py
import tkinter as tk
import finder # 存放业务查询逻辑的模块
from threading import Thread
window = tk.Tk() # 生成ui界面
window.title("查询工具") # 界面标题
window.geometry('600x400+300+100') # 窗口长600宽400,离左侧距离300,离顶部距离100
# value_str = tk.StringVar()
# value_int = tk.IntVar()
value = tk.StringVar()
def thread(func, *args):
"""
使用子线程调用func方法
:param func:
:param args:
:return:
"""
t = Thread(target=func, args=args)
t.setDaemon(True) # 设置为启动线程的守护线程
t.start()
def button():
"""
点击button按钮触发的方法,触发后调用后台查询模块finder获取值
:return:
"""
serviceId = srv_ipt.get() # 获取输入框的值
methodId = md_ipt.get()
value.set("正在查询...") # 赋值给value,在label输出框展示
# print(finder.main(serviceId, methodId)[0])
if serviceId and methodId:
if finder.main(serviceId, methodId):
res_text = '结果行号:%s\n类型名称:%s\n结果数据:\n%s\n' % (finder.main(serviceId, methodId)[0], finder.main(serviceId, methodId)[1], finder.main(serviceId, methodId)[2])
else:
res_text = "未找到数据"
else:
res_text = "请输入serviceid、methodid"
value.set(res_text)
# 容器1,搜索栏
frame1 = tk.Frame() # borderwidth=2边框宽度,relief=tk.RAISED 边框样式
# .pack() 为自适应模式,自动设置对应控件位置大小,.grid()为网格模式
frame1.pack(side=tk.TOP, # 组件在父级中放置的位置
fill=tk.BOTH, # 是否填充pack分配的空间,默认None保持组件原始尺寸,BOTH填充x(水平)和y(垂直)方向空间
ipadx=5, # 水平方向的内边距
ipady=10, # 垂直方向的内边距
padx=3, # 水平方向的外边距
pady=3 # 垂直方向的外边距
)
# serviceid输入框
tk.Label(frame1, text="serviceId:").pack(side='left', padx=5) # 输入框标题
srv_ipt = tk.Entry(frame1, show=None, font=("微软雅黑", 10)) # show文字的显示样式,None保持默认,'*'文字显示为*,密码使用
srv_ipt.pack(side='left', padx=10)
# methodid输入框
tk.Label(frame1, text="methodId:").pack(side='left', padx=5) # 输入框标题
md_ipt = tk.Entry(frame1, show=None, font=("微软雅黑", 10))
md_ipt.pack(side='left', padx=10)
# 查询按钮
search_btn = tk.Button(window, text="查询", width=15, height=3, command=lambda: thread(button)) # command,按钮点击时触发方法,使用子线程调用button方法,防止单线程执行时,干扰mainloop()方法,造成界面假死
search_btn.pack(side="top", fill=None, padx=15, pady=15)
# 输出打印窗口
out_label = tk.Label(window,
text="*** 查询中 ***", # 文本内容
textvariable=value, # tkinder变量的内容,变量变化时,lable中文本自动刷新
justify="left", # 文本对齐方式,取决于anchor的值
anchor="nw", # 文本所在方位,nw为北西
bg="black", # 背景色
fg="white", # 前景色
font=("微软雅黑", 10), # 字体设置
width=10, # label宽度
height=50, # label高度
padx=5, # 水平方向文本外边距
pady=3 # 垂直方向文本外边距
)
out_label.pack(side="bottom", fill="both", padx=10, pady=10,
# ipadx=0, # 无法改变文字与边框的距离
)
if __name__ == "__main__":
window.mainloop()
效果图: