import csv import os import random import tempfile import time import tkinter as tk from io import BytesIO from tkinter import messagebox import requests from PIL import Image, ImageTk from TrialRecommend import DataRequest, Notes_Request import func_collec import dis_collect class Mainpage: def __init__(self,master,name): self.c_data_index=0 self.c_image_index=0 self.c_content='暂无数据!' self.c_image_max=0 self.c_data_max=0 self.content = '' self.time = '' self.collect = '' self.likes = '' self.share = '' self.flag = 0 self.is_pre = 'False' self.current_data_index = 0 self.current_data_image_index = 0 self.current_notes_index = 0 self.max_data_count = 0 self.max_notes_count = 0 self.max_iamge_count = 0 self.data_csv_file_path = 'data.csv' self.notes_csv_file_path = 'notes.csv' self.data_request = None self.research = tk.StringVar() self.user = name self.root = master self.root.title('推荐中心 v0.0.1') # 调用函数来居中窗口 self.center_window(self.root) self.init_main_Page() def init_main_Page(self): self.page = tk.Frame(self.root) self.page.place(relx=0, rely=0, relheight=1, relwidth=1) self.btn_exit = tk.Button(self.page, text='退出', command=self.exit, bg='#D7EFFF', fg='red',font='bold') self.btn_exit.place(relx=0.9, rely=0.9, relheight=0.05, relwidth=0.07) self.lable_user = tk.Label(self.page, text='欢迎您:' + self.user, fg='green', font=24) self.lable_user.place(relx=0.86, rely=0, relheight=0.08, relwidth=0.13) self.text = tk.Text(self.page, bg='#ADD9FE', font=18) self.text.insert(tk.END, self.content) self.text.config(state=tk.DISABLED, cursor='') self.text.place(relx=0.58, rely=0.07, relheight=0.86, relwidth=0.3) self.btn_Image_pre=tk.Button(self.page,text='上一张',bg='#D7EFFF',font=('SimHei',15,'bold'),command=self.pre_image) self.btn_Image_pre.place(relx=0.14, rely=0.01, relheight=0.05, relwidth=0.07) self.btn_Image_next = tk.Button(self.page, text='下一张', bg='#D7EFFF',font=('SimHei',15,'bold'),command=self.next_image) self.btn_Image_next.place(relx=0.24, rely=0.01, relheight=0.05, relwidth=0.07) self.btn_liked_page = tk.Button(self.page, text='我的收藏夹', bg='#D7EFFF',font=('SimHei',15,'bold'),command=self.to_like_page) self.btn_liked_page.place(relx=0.9, rely=0.1, relheight=0.05, relwidth=0.1) self.btn_next = tk.Button(self.page, text='下一篇', bg='#D7EFFF',font=('SimHei',15,'bold'),command=self.next_data) self.btn_next.place(relx=0.45, rely=0.45, relheight=0.08, relwidth=0.09) self.btn_pre = tk.Button(self.page, text='上一篇', bg='#D7EFFF',font=('SimHei',15,'bold'),command=self.back_data) self.btn_pre.place(relx=0.45, rely=0.35, relheight=0.08, relwidth=0.09) self.btn_liked = tk.Button(self.page, text='收藏攻略', bg='#D7EFFF',font=('SimHei',15,'bold'),command=self.func_collect) self.btn_liked.place(relx=0.9, rely=0.2, relheight=0.05, relwidth=0.1) self.btn_dis_liked = tk.Button(self.page, text='取消收藏', bg='#D7EFFF',font=('SimHei',15,'bold'),command=self.func_discollect) self.btn_dis_liked.place(relx=0.9, rely=0.3, relheight=0.05, relwidth=0.1) self.lable_like=tk.Label(self.page,text='喜欢人数:'+self.likes,font=('SimHei',15,'bold')) self.lable_like.place(relx=0.05, rely=0.93) self.lable_like = tk.Label(self.page, text='收藏人数:'+self.collect,font=('SimHei',15,'bold')) self.lable_like.place(relx=0.17, rely=0.93) self.lable_like = tk.Label(self.page, text='转发人数:'+self.share,font=('SimHei',15,'bold')) self.lable_like.place(relx=0.29, rely=0.93) self.entry=tk.Entry(self.page,textvariable=self.research,font=('',20, "bold")) self.entry.place(relx=0.35, rely=0.01, relheight=0.05, relwidth=0.3) self.btn_research=tk.Button(self.page,text='搜索', bg='#D7EFFF',font=("SimHei",20, "bold"),command=self.researchPage) self.btn_research.place(relx=0.66, rely=0.01, relheight=0.05, relwidth=0.1) self.lable_time=tk.Label(self.page,text='发布时间:'+self.time,font=('SimHei',15,'bold')) self.lable_time.place(relx=0.41, rely=0.93) def to_init_page(self): self.page2.destroy() self.init_text() self.init_main_Page() self.update_max() self.image_url(self.current_data_image_index) def to_like_page(self): data=0 with open('collections/{}.csv'.format(self.user),'r+',newline='',encoding='utf-8') as f: reader = csv.reader(f) if len(list(reader))>0: data=1 if data==1: self.c_data_index = 0 self.c_image_index = 0 self.c_content = '暂无数据!' self.c_image_max = 0 self.c_data_max = 0 self.page.destroy() self.c_init_text() self.init_like_page() self.c_image_url() else: self.init_like_page() def c_next_data(self): if self.c_data_index+1 < self.c_data_max: self.c_data_index += 1 self.c_image_index = 0 self.c_init_text() self.init_like_page() self.c_image_url() else: messagebox.showinfo(message='这是最后一篇') def c_pre_data(self): if self.c_data_index-1<0: messagebox.showinfo(message='这是第一篇') else: self.c_data_index -= 1 self.c_image_index=0 self.c_init_text() self.init_like_page() self.c_image_url() def c_image_url(self): with open('collections/{}.csv'.format(self.user),'r+',encoding='utf-8') as f: reader = csv.reader(f) row ='' i=0 for rows in reader: if i==self.c_data_index: row=rows break i += 1 self.load_image_from_url(self.page2,eval(row[2])[self.c_image_index]) def c_pre_image(self): if self.c_image_index - 1 < 0: messagebox.showinfo(title='提示', message='没有上一张了') else: self.c_image_index -= 1 self.c_image_url() def c_next_image(self): if self.c_image_index + 1 >= self.c_image_max: messagebox.showinfo(message='这是最后一张') else: self.c_image_index += 1 self.c_image_url() def c_init_text(self): with open('collections/{}.csv'.format(self.user),'r+',encoding='utf-8') as f: reader = csv.reader(f) i=0 for row in reader: i+=1 self.c_data_max=i flag=0 with open('collections/{}.csv'.format(self.user),'r+',encoding='utf-8') as f: reader = csv.reader(f) if not next(reader): self.c_content='暂无收藏数据' else: flag=1 if flag==1: with open('collections/{}.csv'.format(self.user), 'r+', encoding='utf-8') as f: reader = csv.reader(f) index = 0 for row in reader: if index == self.c_data_index: title = row[1] text = row[3].replace('
', '\n').replace('.
', '\n') self.c_content = title + text self.c_image_max=len(eval(row[2])) break index += 1 def init_like_page(self): self.page2=tk.Frame(self.root) self.page2.place(relx=0,rely=0,relheight=1,relwidth=1) self.btn_init_page = tk.Button(self.page2, text='返回主页面',command=self.to_init_page, bg='#D7EFFF',font=('SimHei',15,'bold')) self.btn_init_page.place(relx=0.9, rely=0.1, relheight=0.05, relwidth=0.1) self.lable_user = tk.Label(self.page2, text='欢迎您:' + self.user, fg='green', font=24) self.lable_user.place(relx=0.86, rely=0, relheight=0.08, relwidth=0.13) self.btn_exit = tk.Button(self.page2, text='退出', command=self.exit, bg='#D7EFFF', fg='red',font='bold') self.btn_exit.place(relx=0.9, rely=0.9, relheight=0.05, relwidth=0.07) self.text = tk.Text(self.page2, bg='#ADD9FE', font=18) self.text.insert(tk.END, self.c_content) self.text.config(state=tk.DISABLED, cursor='') self.text.place(relx=0.58, rely=0.07, relheight=0.86, relwidth=0.3) self.btn_Image_pre = tk.Button(self.page2, text='上一张', bg='#D7EFFF',font=('SimHei',15,'bold'),command=self.c_pre_image) self.btn_Image_pre.place(relx=0.14, rely=0.01, relheight=0.05, relwidth=0.07) self.btn_Image_next = tk.Button(self.page2, text='下一张', bg='#D7EFFF',font=('SimHei',15,'bold'),command=self.c_next_image) self.btn_Image_next.place(relx=0.24, rely=0.01, relheight=0.05, relwidth=0.07) self.btn_next = tk.Button(self.page2, text='下一篇', bg='#D7EFFF',font=('SimHei',15,'bold'),command=self.c_next_data) self.btn_next.place(relx=0.45, rely=0.45, relheight=0.08, relwidth=0.09) self.btn_pre = tk.Button(self.page2, text='上一篇', bg='#D7EFFF',font=('SimHei',15,'bold'),command=self.c_pre_data) self.btn_pre.place(relx=0.45, rely=0.35, relheight=0.08, relwidth=0.09) self.btn_dis_liked = tk.Button(self.page2, text='取消收藏', bg='#D7EFFF',font=('SimHei',15,'bold'),command=self.func_discollect) self.btn_dis_liked.place(relx=0.9, rely=0.3, relheight=0.05, relwidth=0.1) def notes_request(self,next_back): if next_back == 'next': if self.current_data_index + 1 <= self.max_data_count: with open('data.csv', 'r', encoding='utf-8') as f: if self.current_notes_index!=self.flag: self.current_notes_index += 1 self.current_data_index += 1 else: self.current_notes_index += 1 self.current_data_index += 1 self.flag=self.current_notes_index csv_reader = csv.reader(f) data='' i=0 for row in csv_reader: if i == self.current_data_index: data = row[0] break i += 1 if self.is_pre=='False': Notes_Request.notes_request(data) if self.flag==self.current_notes_index: self.is_pre='False' time.sleep(random.uniform(0, 1)) self.update_max() #print(self.max_data_count, self.current_data_index, self.current_data_image_index) self.init_text() self.init_main_Page() self.image_show() else: messagebox.showinfo(message='正在载入新的一批数据,请稍等!') self.data_request.dataRequest() if self.data_request.success == 'True': time.sleep(random.uniform(1, 2)) with open('data.csv', 'r', encoding='utf-8') as f: if self.current_notes_index != self.flag: self.current_notes_index += 1 self.current_data_index += 1 else: self.current_notes_index += 1 self.current_data_index += 1 self.flag = self.current_notes_index csv_reader = csv.reader(f) data='' i=0 for row in csv_reader: if i == self.current_data_index: data = row[0] i += 1 if self.is_pre == 'False': Notes_Request.notes_request(data) if self.flag == self.current_notes_index: self.is_pre = 'True' time.sleep(random.uniform(0, 1)) self.update_max() print(self.max_data_count, self.current_data_index, self.current_data_image_index) self.init_text() self.init_main_Page() self.image_show() else: messagebox.showinfo(message='网络请求失败,请稍后尝试!') if next_back == 'back': if self.current_notes_index-1<0: messagebox.showinfo(message='这是第一篇文章') else: self.is_pre = 'True' self.current_notes_index -= 1 self.current_data_index -= 1 with open('data.csv', 'r', encoding='utf-8') as f: csv_reader = csv.reader(f) first_row = '' i=0 for row in csv_reader: if i==self.current_data_index: first_row=row[0] i += 1 Notes_Request.notes_request(first_row) time.sleep(random.uniform(0, 1)) self.update_max() print(self.max_data_count, self.current_data_index, self.current_data_image_index) self.init_text() self.init_main_Page() self.image_show() # 返回上一篇 def back_data(self): if self.max_data_count != 0: self.current_data_image_index = 0 self.notes_request('back') else: messagebox.showinfo(message='请先搜索') # 下一篇 def next_data(self): if self.max_data_count != 0: self.current_data_image_index = 0 self.notes_request('next') else: messagebox.showinfo(message='请先搜索') # 下一张图片 def next_image(self): if self.max_iamge_count == 0: messagebox.showinfo(message='请先搜索') elif self.current_data_image_index + 1 >= self.max_iamge_count: messagebox.showinfo(message='这是最后一张') else: self.current_data_image_index += 1 self.image_url(self.current_data_image_index) # 上一张图片 def pre_image(self): if self.max_iamge_count == 0: messagebox.showinfo(message='请先搜索') elif self.current_data_image_index - 1 < 0: messagebox.showinfo(title='提示', message='没有上一张了') else: self.current_data_image_index -= 1 self.image_url(self.current_data_image_index) def researchPage(self): self.clear_csv_file() rs = self.research.get() if rs == '': messagebox.showinfo(title='提示', message='你还没有输入任何东西!') else: if DataRequest.DataRequest(str(self.research.get()), self.user).success == 'True': self.content = '' self.time = '' self.collect = '' self.likes = '' self.share = '' self.flag = 0 self.is_pre = 'False' self.current_data_index = 0 self.current_data_image_index = 0 self.current_notes_index = 0 self.max_data_count = 0 self.max_notes_count = 0 self.max_iamge_count = 0 self.data_request = DataRequest.DataRequest(str(self.research.get()), self.user) time.sleep(random.uniform(0,1)) self.init_notes_request() else: messagebox.showinfo(message='网络请求失败,请稍后尝试!') def init_notes_request(self): with open('data.csv', 'r', encoding='utf-8') as f: reader = csv.reader(f) for row in reader: Notes_Request.notes_request(row[0]) break self.update_max() self.init_text() self.init_main_Page() self.image_show() def image_url(self,col): with open(self.data_csv_file_path,'r',encoding='utf-8') as f: reader = csv.reader(f) row ='' i=0 for rows in reader: if i==self.current_data_index: row=rows i += 1 self.load_image_from_url(self.page,eval(row[3])[col]) def load_image_from_url(self,View,url): # 使用requests从URL下载图片 response = requests.get(url) img = Image.open(BytesIO(response.content)) img = img.resize((450, 600), Image.BICUBIC) # 调整像素,使用高质量重采样算法 # 使用PIL的ImageTk将PIL图片转换为Tkinter可以显示的格式 tk_img = ImageTk.PhotoImage(img) # 创建一个标签来显示图片,并添加到Tkinter窗口中 label = tk.Label(View, image=tk_img) label.image = tk_img # 保持对tk_img的引用,防止被垃圾回收 label.place(relx=0.05, rely=0.07) def image_show(self): if self.csv_is_empty(): messagebox.showinfo('提示',message='数据加载失败') else: self.image_url(0) def csv_is_empty(self): with open('notes.csv','r',encoding='utf-8') as f2: rows = [] reader = csv.reader(f2) for row in reader: # 如果找到非空行,则将rows列表设置为非空 if any(row): rows.append(row) return False # 如果只需要检查是否至少有一行非空,则可以提前退出循环 # 如果rows列表为空,则CSV文件是空的(或只包含空行) if len(rows) == 0: print('notes 无数据') return True def init_text(self): with open(self.notes_csv_file_path,'r',encoding='utf-8') as f: reader = csv.reader(f) index=0 for row in reader: if index==self.current_notes_index: title = row[0] text = row[1].replace('
', '\n').replace('.
', '') self.content=title+text self.time = row[2] self.collect = row[3] self.likes = row[4] self.share = row[5] index += 1 def update_max(self): with open(self.data_csv_file_path,'r',encoding='utf-8') as f: reader = csv.reader(f) index=0 for row in reader: if index==self.current_data_index: self.max_iamge_count = len(eval(row[3])) break index+=1 with open(self.data_csv_file_path, 'r', encoding='utf-8') as f: reader = csv.reader(f) counts = 0 for i in reader: counts += 1 self.max_data_count = counts with open(self.notes_csv_file_path,'r',encoding='utf-8') as f: reader = csv.reader(f) counts=0 for i in reader: counts+=1 self.max_notes_count=counts def clear_csv_file(self): with open(self.data_csv_file_path, 'w') as file1: # 使用'w'模式打开文件 pass # 不需要执行任何操作,因为打开文件时内容已被清空 with open(self.notes_csv_file_path, 'w') as file2: pass # 不需要执行任何操作,因为打开文件时内容已被清空 def exit(self): messagebox.showinfo(title='提示', message='欢迎下次使用!') self.root.quit() def center_window(self, root, width=1300, height=700): # 获取屏幕宽度和高度 screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight() # 计算窗口的左上角应该放置的位置 left = (screen_width / 2) - (width / 2) top = (screen_height / 2) - (height / 2) # 设置窗口的位置和大小 root.geometry("{0}x{1}+{2}+{3}".format(width, height, int(left), int(top))) def func_collect(self): if self.max_data_count!=0: func_collec.collec(self.user, self.current_data_index) dic={} with open(self.data_csv_file_path,'r',encoding='utf-8') as f: reader = csv.reader(f) i=0 for row in reader: if i==self.current_data_index: dic={ '文章ID':row[0], '文章标题':row[1], '图片资源':eval(row[3]) } break i+=1 with open(self.notes_csv_file_path,'r',encoding='utf-8') as f: reader = csv.reader(f) i=0 for row in reader: if i==self.current_data_index: dic['文章内容']=row[1] with open('collections/{}.csv'.format(self.user),'a+',encoding='utf-8',newline='') as f: writer = csv.DictWriter(f, fieldnames=['文章ID','文章标题','图片资源','文章内容']) writer.writerow(dic) else: messagebox.showinfo('提示','请先搜索') def func_discollect(self): dis_collect.dis_collec(self.user,self.c_data_index) row_to_delete = self.c_data_index # 使用临时文件来存储修改后的内容 with open('collections/{}.csv'.format(self.user), newline='', encoding='utf-8') as csvfile, \ tempfile.NamedTemporaryFile(mode='w+t', newline='', encoding='utf-8', delete=False) as temp: reader = csv.reader(csvfile) writer = csv.writer(temp) # 读取并写入除了要删除的行之外的所有行 for i, row in enumerate(reader): if i != row_to_delete: writer.writerow(row) try: os.remove('collections/{}.csv'.format(self.user)) except FileNotFoundError: pass # 将临时文件重命名为原始文件名 os.rename(temp.name, 'collections/{}.csv'.format(self.user)) if __name__ == '__main__': root = tk.Tk() Mainpage(master=root,name='Null') root.mainloop()