import csv import random 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 class Mainpage: def __init__(self,master,name): 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')) 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_index, self.current_data_image_index) def to_like_page(self): self.page.destroy() self.init_like_page() 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.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')) 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')) 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')) 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')) self.btn_pre.place(relx=0.45, rely=0.35, relheight=0.08, relwidth=0.09) self.btn_liked = tk.Button(self.page2, text='收藏攻略', bg='#D7EFFF',font=('SimHei',15,'bold')) self.btn_liked.place(relx=0.9, rely=0.2, relheight=0.05, relwidth=0.1) self.btn_dis_liked = tk.Button(self.page2, text='取消收藏', bg='#D7EFFF',font=('SimHei',15,'bold')) self.btn_dis_liked.place(relx=0.9, rely=0.3, relheight=0.05, relwidth=0.1) self.lable_like = tk.Label(self.page2, text='喜欢人数:', font=('SimHei',15,'bold')) self.lable_like.place(relx=0.05, rely=0.93) self.lable_like = tk.Label(self.page2, text='收藏人数:', font=('SimHei',15,'bold')) self.lable_like.place(relx=0.17, rely=0.93) self.lable_like = tk.Label(self.page2, text='转发人数:', font=('SimHei',15,'bold')) self.lable_like.place(relx=0.29, rely=0.93) 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_index, 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_index, 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())).success=='True': self.data_request = DataRequest.DataRequest(str(self.research.get())) 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,index,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(self.current_data_index,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) else: messagebox.showinfo('提示','请先搜索') if __name__ == '__main__': root = tk.Tk() Mainpage(master=root,name='Null') root.mainloop()