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(涂聚文)
浙公网安备 33010602011771号