Python UI设计例子--Panda文件读取 复选框动态生成 绑定事件响应函数 动态更新复选项目等

发布时间 2023-08-21 08:03:40作者: Freeland98

  该例子程序通过详细的注释解释了如何设计和实现Python图形界面程序,主要实现的功能有:panda文件读取、根据读取文件列标题信息动态生成和添加复选框控件、为动态生成的控件绑定响应函数、动态更新复选框选定项目、如何为按钮控件绑定响应函数等功能。

1 Python程序源代码

import numpy as np

import tkinter as tk

from tkinter import filedialog

import pandas as pd

#设置字典(dictionary)变量记住创建的每一个复选按钮

global vCkButton 

vCkButton={}

def Ui_main():

    # 创建窗口

    rootWindow = tk.Tk()

    #得到系统显示器的宽和高

    sw = rootWindow.winfo_screenwidth()

    sh = rootWindow.winfo_screenheight()

    #设置要创建窗口的宽和高

    ww, wh = 800,400

    x, y = (sw - ww) / 2, (sh - wh) / 2

    # 居中放置窗口

    rootWindow.geometry("%dx%d+%d+%d" % (ww, wh, x, y))  

    # 设置主窗口的标题

    rootWindow.title('Python图形用户界面设计')  

    #创建一个Label控件用来显示从目标文件中读取的列标题

    labeltext = tk.Label(rootWindow)

    # 创建字符串变量

    vLabelStr = tk.StringVar()

    vLabelStr.set('点击《选择数据集》按钮打开数据文件,然后根据提示信息选择训练模型所需要的数据集合:')

    #wraplength=500 Label 显示的文本分行,该参数指定了分行后每一行的长度,默认值为 0

    #textvariable:输入框的内值,也称动态字符串,使用 StringVar() 对象来设置,而text属性为静态字符串对象

    tk.Label(rootWindow, textvariable=vLabelStr, font=('黑体',16), width=80, height=3,

            wraplength=500).pack()

    tk.Button(rootWindow, text='选择数据集', width=20, height=2, bg='#BEBEBE',

              command=lambda: showCheckbox(vLabelStr,labeltext,rootWindow),

              font=('圆体', 10)).pack()

    vLabel = tk.Label(rootWindow, text="选择你需要的“列”(请用“空格”隔开,列编号从0开始)")

    vLabel.pack()

    #定义一个全局变量接收控制文本输入框的值

    global vEntryStr

    vEntryStr=tk.StringVar()

    vEntryStr.set("")

    #创建并显示文本框控件

    vEntry = tk.Entry(rootWindow, bd=5,textvariable=vEntryStr,width=50)

    vEntry.pack()

#     在窗口内创建按钮,以表格的形式依次排列

#     for i in range (10):

#         for j in range (10):

#             Button (rootWindow, text=" (" + str(i) + ","+ str(j)+ ")",bg='#D1EEEE') .grid(row=i,column=j)

    #显示从目标文件中读取的列标题

    labeltext.pack()

    # 在主窗口上添加一个frame控件,后面用来添加布局复选框控件

    global labFrame

    labFrame = tk.LabelFrame(rootWindow, text = "选择需要的列数据")

    labFrame.pack()

    #开启主循环,让窗口处于显示状态

    rootWindow.mainloop()

#按钮绑定函数必须有event参数

# def getSelected(event):

#     vEntryStr.set("")

#     for i in range(len(vIntVar)):

#         if vIntVar[i].get()==1:

#             vEntryStr.set(vEntryStr.get()+" "+str(i))

# 复选按钮单击事件的响应函数        

def getSelected1(iIndex):

    #首先清空文本框内容 

    vEntryStr.set("")

    for i in range(len(vIntVar)):

        #忽略激活响应函数的复选按钮信息:i!=iIndex

        if vIntVar[i].get()==1 and i!=iIndex:

            vEntryStr.set(vEntryStr.get()+" "+str(i))

    #把激活响应函数的复选按钮编号放在输入框的最后位置

    if vIntVar[iIndex].get()==1:

        vEntryStr.set(vEntryStr.get()+" "+str(iIndex))

def showCheckbox(vLabelStr,labeltext,rootWindow):    

    #重新选择文件时清空文本框以前的内容

    vEntryStr.set("")    

    global file_path

    file_path = filedialog.askopenfilename()

    #没有选择文件直接退出

    if file_path=="":

        return

    vLabelStr.set("注意:最后一列为Label(目标)数据")

    # 读取文件第一行标签

    with open(file_path, 'r', encoding='gb2312') as f:

        # with open(file_path, 'r', encoding='utf-8') as f:

        lines = f.readlines()  # 读取所有行

        #得到文件第一行数据(列标题)

        line1 = lines[0]

    #通过参数传递的labeltext标签变量在已经创建的Label控件上显示列标题

    labeltext.configure(text=line1)

    labeltext.text = line1

    #当重新选择文件时删除以前创建的复选框按钮

    for i in range(len(vCkButton)):

        vCkButton[i].destroy()     

    vColumTitleList=line1.split(",")

    #设置字典(dictionary)变量记住创建的每一个复选按钮的编号      

    global vIntVar

    vIntVar={}

    i=0

    #控件绑定函数需要参数的写法:command=lambda:getSelected1(i)

    #绑定多个函数需要用command=lambda:[getSelected1(i),getSelected2(i,j)]

    for colname in vColumTitleList:

        vIntVar[i]=tk.IntVar()

        #给绑定函数传递参数command=lambda iIndex=i:getSelected1(iIndex)

        #不能直接把变量i作为参数传递给绑定的函数,因为程序的编译执行只记住并传递循环变量i的最后一个值

        #通过iIndex=i语句实现正确参数传递

        vCkButton[i]=tk.Checkbutton(labFrame, text=str(i)+"."+colname,font=('微软雅黑', 14,'bold'),

                    variable =vIntVar[i],onvalue=1,offvalue=0,

                    command=lambda iIndex=i:getSelected1(iIndex))

        #行号、列号从0开始 每行显示6个项目

        vCkButton[i].grid(row=int(i/6),column=i%6)

        i=i+1 

#     btn = tk.Button(rootWindow,text="选好了",bg='#BEBEBE')

#     <ButtonPress-1> 单击鼠标左键,简写为<Button-1>,后面的数字可以是1/2/3,分别代表左键、中间滑轮、右键

#     btn.bind("<Button-1>",getSelected) #绑定buttonClicked方法

#     btn.pack()

if __name__ == "__main__": 

  Ui_main()

2 程序运行效果