通过tkinter做一个简单的ui,输入关键字,查到对应结果(需要绑定后台查询方法)

 界面使用按钮Button、输入框Entry、展示控件Label(可展示文字或图片)以及容器Frame。其中Frame可作为父控件容纳其他控件,示例中使用Frame包裹了两个Entry和Label,主要是为了优化pack()自适应排版问题。在默认情况下,自适应排版会从竖直中心线,从上往下排列(如下图)

python tkinter 创建输入框 指定位置_控件

 

 

单个控件可以通过side和padx调整位置,但多个控件在自适应模式下,如示例中两个文字Label,两个输入框Entry,则难以调整到想要的布局,

python tkinter 创建输入框 指定位置_控件_02

 

 

通过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()

 

 

效果图:

python tkinter 创建输入框 指定位置_ide_03

 

 

python tkinter 创建输入框 指定位置_输入框_04