python: Eclipse 2024‑03 R+pydev
https://www.eclipse.org/downloads/packages/release/2024-03/r
參考配置環境:
https://marketplace.eclipse.org/content/pydev-python-ide-eclipse
# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述: # Author : geovindu,Geovin Du 涂聚文. # IDE : Eclipse 2022.12 python 3.11 # OS : windows 10 # Datetime : 2024/12/4 21:31 # User : geovindu # Product : Eclipse # Project : ictsimple # File : treeviewschool.py # explain : 学习 import os import sys import io from operator import iconcat from tkinter import * import ttkbootstrap as ttk from ttkbootstrap.constants import * from ttkbootstrap.tableview import Tableview from tkinter import messagebox as msg class Mainschool(ttk.Window): """ """ def __init__(self): """ """ super().__init__(themename="cosmo", title="school manage") # self.Window(themename="cosmo") #superhero self.maxsize = 300 # self.geometry('{}x{}'.format(1350, 900)) self.first_var = ttk.Variable() self.title = "school manage" #self.themename = 'superhero' self.iconbitmap('favicon.ico') #self.app = ttk.Window() #self.app.iconbitmap("favicon.ico") # 'studentID', 'firstname', 'lastname', 'schoolname', 'teltype', 'telno' # app.tk.call('wm', 'iconphoto', app._w, PhotoImage(file='image/1.png')) self.vid = StringVar() self.vfname = StringVar() self.vlname = StringVar() self.vschoolname = StringVar() self.vteltype = StringVar() self.vtelno = StringVar() frame1 = ttk.Frame(self) frame1.pack() ttk.Label(frame1, text='id:').grid(column=0, row=0, padx=5, pady=5, sticky=E) self.entid = ttk.Entry(frame1, textvariable=self.vid) self.entid.grid(column=1, row=0, padx=5, pady=5, sticky=W) # ent_id.pack(side=LEFT) ttk.Label(frame1, text='First Name:').grid(column=2, row=0, padx=5, pady=5, sticky=E) self.entfname = ttk.Entry(frame1, textvariable=self.vfname) # ent_fname.pack(side=LEFT) self.entfname.grid(column=3, row=0, padx=5, pady=5, sticky=W) ttk.Label(frame1, text='Last Name:').grid(column=4, row=0, padx=5, pady=5, sticky=E) self.entlname = ttk.Entry(frame1, textvariable=self.vlname) # ent_lname.pack(side=LEFT) self.entlname.grid(column=5, row=0, padx=5, pady=5, sticky=W) ttk.Label(frame1, text='school Name:').grid(column=6, row=0, padx=5, pady=5, sticky=E) self.entschoolname = ttk.Entry(frame1, textvariable=self.vschoolname) # ent_schoolname.pack(side=LEFT) self.entschoolname.grid(column=7, row=0, padx=5, pady=5, sticky=W) ttk.Label(frame1, text='typetel:').grid(column=8, row=0, padx=5, pady=5, sticky=E) self.entteltype = ttk.Entry(frame1, textvariable=self.vteltype) # ent_teltype.pack(side=LEFT) self.entteltype.grid(column=9, row=0, padx=5, pady=5, sticky=W) ttk.Label(frame1, text='tel:').grid(column=10, row=0, padx=5, pady=5, sticky=E) self.enttelno = ttk.Entry(frame1, textvariable=self.vtelno) # ent_telno.pack(side=LEFT) self.enttelno.grid(column=11, row=0, padx=5, pady=5, sticky=W) self.btnedit = ttk.Button(frame1, text='Edit Row', command=self.updateRow) # btn_edit.pack(side=LEFT) self.btnedit.configure(state=DISABLED) # 不可用 self.btnedit.grid(column=12, row=0, padx=5, pady=5, sticky=W) # 'studentID', 'firstname', 'lastname', 'schoolname', 'teltype', 'telno' columns = [ {'text': 'studentID', 'stretch': True}, {'text': 'First Name', 'stretch': True}, {'text': 'Last Name', 'stretch': True}, {'text': 'schoolname', 'stretch': True}, {'text': 'teltype', 'stretch': True}, {'text': 'telno', 'stretch': True}, {'text': 'edit', 'stretch': False, 'anchor': CENTER}, {'text': 'delete', 'stretch': False, 'anchor': CENTER} ] self.loadRecord() data = [] # '📄🖉', '❌' for dt in record: row = dt row.append('📄🖉') row.append('❌') data.append(row) colors = self.style.colors self.dt = Tableview(self, coldata=columns, rowdata=data, paginated=True, pagesize=15, searchable=True, bootstyle=PRIMARY, stripecolor=(colors.light, None), ) self.dt.pack() self.dt.view.bind('<ButtonRelease-1>', self.onSelectItem) self.btnadd = ttk.Button(self, text='Add Row', command=self.addRow) self.btnadd.pack() def loadRecord(self): """ 加载学生文本文件的所有学生信息 :return: """ global record file = "student.txt" if os.path.exists(file): # 文件是否存在,存在读取文件 f = open(file, mode="r", encoding='utf-8') # 读取学生文本文件的所有学生信息 record = f.readlines() for i in range(0, len(record)): record[i] = record[i].replace("\n", "") # 把换行符号,替换成空字符 record[i] = record[i].split(";") # 把分号的的行数据进行分割 f.close() def searchRecordByFirstname(self,firstname: str) -> int: """ 查找名字所在列的索引值 index :param firstname: 名字 :return: 返回索引值 """ for i in range(0, len(record)): if record[i][1] == firstname: # 等于这个名字的一行记录打印 for j in range(0, len(record[i])): print(record[i][j], end=' ') return i return -1 def searchRecordByStudent(self,studentno: str) -> int: """ 查找学生所在列的索引值 index :param studentno: 学生编号 :return: 返回索引值 """ if record is not None: if len(record) > 0: for i in range(0, len(record)): if record[i][0] == studentno: # 找到输入参数学号的记录的索引值 return i return -1 def updateRecord(self,sudentno: str, firstname: str, lastname: str, schoool: str, noType: str, number: str) -> bool: """ 更新记录,并更新至文本文件中 :param sudentno: 学生编号 :param firstname: 名 :param lastname: 姓 :param schoool: 学校名称 :param noType: 电话类型 :param number: 电话 :return: """ ok = False print('no:',sudentno) row = self.searchRecordByStudent(sudentno) data = [sudentno, firstname, lastname, schoool, noType, number] # 把要列新的信息,放在1D list中。便于更新2D list一行记录 if row != -1: record[row] = data # 当前索引值的记录的赋值 self.updateFile() # update file data 修改之后更新文件记录行 print("Record Update!") ok = True return ok else: print("Record not Update!") return ok def deleteRecordByFirstname(self,firstname: str): """ 删除查找名字所在行的值 :param firstname: :return: """ ok = False row = self.searchRecordByFirstname(firstname) if row != -1: for j in range(0, len(record)): # global record record[row][j] = "---" # 不是真正删除,只是把这一行赋值为--- 对于当前行中的每列的记录更新 # update_file() # update file data 删除之后更新文件记录行 print("Record deleted!") ok = True return ok else: print("Record not found!") return ok def addRecord(self,sudentno: str, firstname: str, lastname: str, schoool: str, noType: str, number: str) -> bool: """ 添加一行学生信息 :param sudentno: 学生编号 :param firstname: 名 :param lastname: 姓 :param schoool: 学校名称 :param noType: 电话类型 :param number: 电话 :return: """ file = "student.txt" ok = False try: if os.path.exists(file): f = open(file, mode="a", encoding='utf-8') f.write( "\n" + sudentno + ";" + firstname + ";" + lastname + ";" + schoool + ";" + noType + ";" + number) # 添加一行到文本文件中 f.close() print('insert ok') ok = True return ok except Exception as erro: print('insert no') return ok pass def updateFile(self): """ 更新学生信息到文本文件中 :return: """ f = open("student.txt", mode="w", encoding='utf-8') # 更新所有学生信息,保存至文本文件中 for i in range(0, len(record)): f.write( record[i][0] + ";" + record[i][1] + ";" + record[i][2] + ";" + record[i][3] + ";" + record[i][4] + ";" + record[i][5]) # 对每一行记录,进行写录,所以在这里用循环 if i < len(record) - 1: f.write("\n") f.close() def addRow(self): """ :return: """ id = self.entid.get() fname = self.entfname.get() lname = self.entlname.get() schoolname = self.entschoolname.get() teltyp = self.entteltype.get() elno = self.enttelno.get() print(fname) if fname != '' and lname != '': if msg.askyesno('info', f'Confirm add?', parent=self): self.dt.insert_row(END, [id, fname, lname, schoolname, teltyp, elno, '📄🖉', '❌']) self.dt.load_table_data() rows_obj = self.dt.get_rows() matriz = [row.values for row in rows_obj] print('var matriz --> Before edit - table itens:', matriz) # 数据也添加 self.addRecord(id, fname, lname, schoolname, teltyp, elno) # 清空输入框的数据 self.entid.delete(0, '') self.entfname.delete(0, '') self.entlname.delete(0, '') self.entschoolname.delete(0, '') self.entteltype.delete(0, '') self.enttelno.delete(0, '') else: print('no') msg.showinfo("info", "no empty", icon='error') # icon='info' question warning return def updateRow(self): """ ID 不可以修改 :return: """ self.btnedit.configure(state=DISABLED) self.btnadd.configure(state=NORMAL) self.dt.view.configure(selectmode=EXTENDED) self.dt.configure(bootstyle='primary-table') if msg.askyesno('info', f'Confirm Edit?', parent=self): rows = [[self.vid.get(), self.vfname.get(), self.vlname.get(), self.vschoolname.get(), self.vteltype.get(), self.vtelno.get(), '📄🖉', '❌']] if rows != []: selected = self.dt.view.focus() for item in rows: self.dt.view.item(selected, values=item) self.dt.load_table_data() rows_obj = self.dt.get_rows() matriz = [row.values for row in rows_obj] '''''' print('var matriz --> After editing - table itens:', matriz) # 数据也修改 self.loadRecord() self.updateRecord(self.vid.get(), self.vfname.get(), self.vlname.get(), self.vschoolname.get(), self.vteltype.get(), self.vtelno.get()) # 清空输入框的数据 self.entid.configure(state=NORMAL) self.entid.delete(0, '') self.entfname.delete(0, '') self.entlname.delete(0, '') self.entschoolname.delete(0, '') self.entteltype.delete(0, '') self.enttelno.delete(0, '') return def onSelectItem(self,event=None): """ :param event: :return: """ table_mode = str(self.dt.view.cget('selectmode')) if table_mode == 'extended': curItem = self.dt.view.item(self.dt.view.focus()) col = self.dt.view.identify_column(event.x) region = self.dt.view.identify_region(event.x, event.y) if region == 'cell': if col == '#7': # 'cell' edit 放在最后两行,或是最前两行 self.entid.configure(state=DISABLED) self.vid.set(curItem['values'][0]) self.vfname.set(curItem['values'][1]) self.vlname.set(curItem['values'][2]) self.vschoolname.set(curItem['values'][3]) self.vteltype.set(curItem['values'][4]) self.vtelno.set(curItem['values'][5]) self.btnedit.configure(state=NORMAL) self.btnadd.configure(state=DISABLED) self.dt.view.configure(selectmode='none') self.dt.configure(bootstyle='secondary-table') if col == '#8': # 'cell' delete iids = self.dt.view.selection() if len(iids) > 0: if msg.askyesno('Warning', f'Confirm Deletion?', parent=self, icon='error'): prev_item = self.dt.view.prev(iids[0]) self.dt.delete_rows(iids=iids) self.dt.view.focus(prev_item) self.dt.view.selection_set(prev_item) return main=Mainschool() main.mainloop()
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)