前面已经完成了欢迎页面中各个按钮与新建、修改页面的关联,也完成了新建名片保存到txt文件中的功能。
本次主要完成的功能有二:
- 将card.txt文件中的内容读取到tablewidget中,并增加一个空白行,以便直接修改名片;
- 点击保存修改按钮,将修改后的内容保存到card.txt文档,并刷新tablewidget。
保存
的槽函数save_all
上次已经定义了,只需完善函数内容就行;完成这两个功能还需要增加一个刷新Refrese
的槽函数,并且将修改按钮的点击信号同时与save_all
和Refrese
做链接。Refrese
其实就是实现将card.txt文件中的内容读取到tablewidget中。
修改后的edit_window
代码如下:
from PyQt5.Qt import *
from resource.edit_ui import Ui_Dialog
import os
class Edit(QDialog, Ui_Dialog):
save_all_signal = pyqtSignal()
refrese_singnal = pyqtSignal()
def __init__(self):
super().__init__()
self.setupUi(self)
def Refrese(self):
file = open("card.txt",encoding="UTF-8")
file_count = file.readlines()
card_list = []
for i in range(0, len(file_count)):
card_list.append(eval(file_count[i]))
self.tableWidget.setRowCount(len(file_count)+1)
for card_dict in card_list:
name = QTableWidgetItem(card_dict["name"])
phone = QTableWidgetItem(card_dict["phone"])
email = QTableWidgetItem(card_dict["email"])
self.tableWidget.setItem(card_list.index(card_dict),0,name)
self.tableWidget.setItem(card_list.index(card_dict), 1, phone)
self.tableWidget.setItem(card_list.index(card_dict), 2, email)
self.refrese_singnal.emit()
def save_all(self):
row = self.tableWidget.rowCount()
file2 = open("card2.txt", "a", encoding="UTF-8")
for i in range(row):
try:
carddict = {"name":self.tableWidget.item(i,0).text(), "phone":self.tableWidget.item(i,1).text(), "email":self.tableWidget.item(i,2).text()}
file2.write(str(carddict))
file2.write("\n")
except:
print("错误")
# todo 做一个错误对话框
file2.close()
os.remove("card.txt")
os.rename("card2.txt", "card.txt")
self.save_all_signal.emit()
def delete_item(self):
selected_items = self.tableWidget.selectedItems()
for items in selected_items:
self.tableWidget.removeRow(self.tableWidget.indexFromItem(items).row())
if __name__ == '__main__':
import sys
QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
app = QApplication(sys.argv)
window = Edit()
# window.save_all_signal.connect(lambda a:print(a))
window.show()
sys.exit(app.exec_())
同时,点击欢迎页面的查看按钮,名片应该载入到tabelwidget中,所以,主程序也要修改一下,修改后的主程序如下:
#coding=utf-8
from welcome_pane import Welcome
from create_pane import Create
from edit_pane import Edit
from PyQt5.Qt import *
def write_card(name,phone,email):
card_dic= {"name":name,"phone":phone,"email":email}
file_handle = open('card.txt', "a",encoding="utf-8")
file_handle.write(str(card_dic))
file_handle.write('\n')
file_handle.close()
print('%s 名片已存入' % name)
if __name__ == "__main__":
import sys
QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
app = QApplication(sys.argv)
welcome = Welcome()
create = Create()
edit = Edit()
welcome.show_create_pane_signel.connect(create.show)
welcome.show_edit_pane_signal.connect(edit.show)
welcome.show_edit_pane_signal.connect(edit.Refrese)
create.create_card_singel.connect(lambda name,phone,email: write_card(name,phone,email))
welcome.show()
sys.exit(app.exec_())
本次修改有几个问题:
- 写入和读取card.txt的时候必须加上
encoding = 'utf-8'
,不然读写的都是乱码,之前在做没有用户界面的时候没有这个问题啊,是什么原因呢? - 字典键值对的值是空的时候,回发生错误,所以必须用try方法做异常处理,后续可以做一个弹出错误信息框
思考:
- 修改其实就是重新写了一个card.txt文件覆盖掉之前的了。怎么能够在原文件上仅修改变更的位置呢?
- 欢迎页面应该在点击按钮弹出其他窗口时隐藏
各位大佬有什么好的意见,还请多多指出!