1 场景需求

点击西瓜数据按钮新建一个窗口,该窗口默认读取程序设定好的数据文件,并显示在创建好的表格控件中,如果需要导入新的文件可以通过更改文件按钮进行更改,点击显示按钮会将原来表格控件中的数据清除,并插入新数据用以显示。
场景描述


2 运行效果

  1. 窗口1界面
    窗口1

  2. 点击西瓜数据按钮
    点击西瓜数据

  3. 点击更改文件按钮
    点击更改

  4. 选新文件以后,点击显示按钮(这里随便新建了一个文件)
    点击显示


2 代码实现

1 带垂直滚动条的表格:

代码如下:

	# 原始数据显示
	Label(self.page, text="初始样本数据").grid(row=0, sticky=W)
	self.listBox = ttk.Treeview(self.page, height=15, columns=self.header, show='headings')  # 创建表格
	self.VScroll = ttk.Scrollbar(self.page, orient='vertical', command=self.listBox.yview)  # 创建滚动条
	self.listBox.configure(yscrollcommand=self.VScroll.set)  # 滚动条与表格控件关联
	self.VScroll.grid(row=1, column=5, sticky=NS)  # 滚动条放置位置
	for col in self.header:  # 显示表头以及设置列宽
		self.listBox.column(col, width=100, anchor='center')
		self.listBox.heading(col, text=col)
	self.listBox.grid(row=1, column=0, columnspan=4) # 表格放置位置

2 读取数据

代码如下:

	# 读取当前文件的数据
    def readDataSet(self):
        content = []  # 存放不包含表头的数据内容
        wb = load_workbook(self.data_path)
        sheet1 = wb.worksheets[self.sheet_index]
        # 迭代读取所有的行
        cnt = 0
        for row in sheet1.rows:
            row_val = [col.value for col in row]
            if cnt == 0:
                pass
            else:
                content.append(row_val)
            cnt = cnt + 1
        print(content)
        return content
   

3 显示数据

代码如下:

	# 显示当前文件的轨道电路数据集
    def show(self):
        self.listBox.delete(*self.listBox.get_children())  # 清空原先表格
        tempList = self.readDataSet()  # 导入当前文件数据
        for i, row in enumerate(tempList, start=1):
            self.listBox.insert("", "end", values=(i, row[1], row[2], row[3]))

3 涉及模块

  • MainPage.py
from view import *
from Watermelon import *


class MainPage(object):
    def __init__(self, master):
        self.root = master  # 定义内部变量root
        self.root.geometry('%dx%d' % (600, 400))  # 设置窗口大小
        self.createPage()

    def createPage(self):
        # 创建不同的界面frame
        self.selectPage = selectPage(self.root)  # 子系统选择界面
        self.window1Page = window1_Frame(self.root)  # 窗口1界面
        self.window2Page = window2_Frame(self.root)  # 窗口2界面
        self.aboutPage = AboutFrame(self.root)  # 关于信息界面

        # 窗口选择界面的按钮布局
        Button(self.selectPage, text='窗口1', font=('Microsoft YaHei', 12), command=self.window1_Disp).grid(stick=E + W)
        Label(self.selectPage).grid(stick=E + W)  # 空一行
        Label(self.selectPage).grid(stick=E + W)  # 空一行
        Button(self.selectPage, text='窗口2', font=('Microsoft YaHei', 12), command=self.window2_Disp).grid(stick=E + W)

        # 窗口1界面的按钮布局
        Button(self.window1Page, text='西瓜数据', font=('Microsoft YaHei', 12), command=self.Watermelon_Disp).grid(
            stick=E + W, padx=10)
        Label(self.window1Page).grid(stick=E + W)  # 空一行
        Label(self.window1Page).grid(stick=E + W)  # 空一行
        Button(self.window1Page, text='返回', font=('Microsoft YaHei', 12), command=self.selcetmodel).grid(stick=E + W,
                                                                                                         padx=10)

        # 窗口2系统界面的按钮布局
        Button(self.window2Page, text='其他界面', font=('Microsoft YaHei', 12)).grid(stick=E + W, padx=10)
        Label(self.window2Page).grid(stick=E + W)  # 空一行
        Label(self.window2Page).grid(stick=E + W)  # 空一行
        Button(self.window2Page, text='返回', font=('Microsoft YaHei', 12), command=self.selcetmodel).grid(stick=E + W,
                                                                                                         padx=10)

        self.selectPage.pack()  # 默认显示诊断子系统选择界面
        menubar = Menu(self.root)
        menubar.add_command(label='窗口选择', command=self.selcetmodel)
        menubar.add_command(label='窗口1', command=self.window1_Disp)
        menubar.add_command(label='窗口2', command=self.window2_Disp)
        menubar.add_command(label='关于', command=self.about_Disp)
        self.root['menu'] = menubar  # 设置菜单栏

    def selcetmodel(self):
        self.selectPage.pack()
        self.window1Page.pack_forget()
        self.window2Page.pack_forget()
        self.aboutPage.pack_forget()

    def window1_Disp(self):
        self.selectPage.pack_forget()
        self.window1Page.pack()
        self.window2Page.pack_forget()
        self.aboutPage.pack_forget()

    def window2_Disp(self):
        self.selectPage.pack_forget()
        self.window1Page.pack_forget()
        self.window2Page.pack()
        self.aboutPage.pack_forget()

    def about_Disp(self):
        self.selectPage.pack_forget()
        self.window1Page.pack_forget()
        self.window2Page.pack_forget()
        self.aboutPage.pack()

    def Watermelon_Disp(self):  # FDT界面显示
        self.subroot = Tk()  # 定义子窗口root
        Watermelon_Page(self.subroot)

  • watermelon.py
from tkinter import *
from tkinter import ttk
from tkinter import filedialog
from openpyxl import load_workbook


class Watermelon_Page(object):
    def __init__(self, master=None):
        self.root = master  # 定义内部变量root
        self.root.title('西瓜')
        self.root.geometry('%dx%d' % (600, 400))  # 设置窗口大小

        self.data_path = '西瓜.xlsx'  # 初始西瓜数据集路径
        self.sheet_index = 0  # 默认获取第1张sheet
        self.header = ('序号', '密度', '含糖率', '是否是好瓜')  # 显示数据的表头

        self.createPage()

    def createPage(self):
        self.page = Frame(self.root)  # 创建Frame
        self.page.pack()

        # 原始数据显示
        Label(self.page, text="初始样本数据").grid(row=0, sticky=W)
        self.listBox = ttk.Treeview(self.page, height=15, columns=self.header, show='headings')  # 创建表格
        self.VScroll = ttk.Scrollbar(self.page, orient='vertical', command=self.listBox.yview)  # 创建滚动条
        self.listBox.configure(yscrollcommand=self.VScroll.set)  # 滚动条与表格控件关联
        self.VScroll.grid(row=1, column=5, sticky=NS)  # 滚动条放置位置
        for col in self.header:  # 显示表头以及设置列宽
            self.listBox.column(col, width=100, anchor='center')
            self.listBox.heading(col, text=col)
        self.listBox.grid(row=1, column=0, columnspan=4)

        # tempList = self.readDataSet()  # 表格显示初始数据
        # for i, row in enumerate(tempList, start=1):
        #     self.listBox.insert("", "end", values=(i, row[1], row[2], row[3]))

        self.show()  # 表格显示初始数据

        Button(self.page, text='更改文件', width=10, command=self.open_file).grid(row=16, column=0)  # 重新导入数据按钮
        Button(self.page, text="显示", width=10, command=self.show).grid(row=16, column=1)  # 显示当前文件数据的按钮
        Button(self.page, text="关闭", width=10, command=self.page.destroy).grid(row=16, column=2)  # 显示当前文件数据的按钮

    # 读取excel文件函数
    def open_file(self):
        filepath = filedialog.askopenfilename(title='打开Excel文件', filetypes=[('Excel Files', '*.xlsx')])
        if filepath != '':
            self.data_path = filepath
        print(self.data_path)

    # 读取当前文件的数据
    def readDataSet(self):
        content = []  # 存放不包含表头的数据内容
        wb = load_workbook(self.data_path)
        sheet1 = wb.worksheets[self.sheet_index]
        # 迭代读取所有的行
        cnt = 0
        for row in sheet1.rows:
            row_val = [col.value for col in row]
            if cnt == 0:
                pass
            else:
                content.append(row_val)
            cnt = cnt + 1
        print(content)
        return content

    # 显示当前文件的轨道电路数据集
    def show(self):
        self.listBox.delete(*self.listBox.get_children())  # 清空原先表格
        tempList = self.readDataSet()  # 导入当前文件数据
        for i, row in enumerate(tempList, start=1):
            self.listBox.insert("", "end", values=(i, row[1], row[2], row[3]))


4 写在后面

demo工程文件已经上传至CSDN下载资源和GitHub上,CSDN下载链接GitHub链接

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐