Python UI设计例子--Panda文件读取 复选框动态生成 绑定事件响应函数 动态更新复选项目等
该例子程序通过详细的注释解释了如何设计和实现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 程序运行效果
本文来自博客园,作者:Freeland98,转载请注明原文链接:https://www.cnblogs.com/Freeland98/p/17645039.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出,原文链接