前言
下面介绍一个阅读小工具,可以实现对字符文件(txt等)的读写,并显示到tk窗口上,能够进行简单的翻页,查询,隐藏,设置透明度等功能。
效果图
read.exe
一、代码介绍
1.引入库
代码如下(示例):
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
from tkinter import ttk
from tkinter import font
import tkinter.colorchooser as colorchooser
from pynput.mouse import Listener
import threading
2.界面
界面由三部分组成:sampleapp,StartPage,pageone
使用容器container 来加载StartPage,pageone两个界面,实现窗口内切换
1 SampleApp
代码如下(示例):
class SampleApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
global flag_w
flag_w=True
self.title("阅读")
self.geometry("400x95+500+200")
self.container = tk.Frame(self)
self.container.pack(side="top", fill="both", expand=True)
# self.attributes("-alpha", 0.9) # 设置透明度
self.resizable(False,False)
# self.maxsize(450,100)qq
# self.minsize(400,65)
self.container.configure(bg="#fbfbfb")
self.frames = {}
self.start_page = StartPage(self.container, self)
self.frames[StartPage] = self.start_page
self.start_page.grid(row=0, column=0, sticky="nsew")
self.bind("q", self.show_update)
def show_update(self,event):
global flag_w
print(flag_w)
if flag_w :
self.attributes('-topmost', True)
self.geometry("400x{}+500+200".format(self.winfo_height()))
self.attributes("-alpha", 0.9) # 设置透明度
flag_w=False
else:
self.attributes("-alpha", 0) # 设置透明度
flag_w=True
def show_page_one(self, filename):
self.start_page.get_selected_item()
self.start_page.combo.configure(state="disabled")
self.page_one = PageOne(self.container, self, filename)
self.frames[PageOne] = self.page_one
self.page_one.grid(row=0, column=0, sticky="nsew")
self.page_one.tkraise()
def show_page_start(self):
self.set_first_line_value()
self.start_page = StartPage(self.container, self)
self.frames[StartPage] = self.start_page
self.start_page.grid(row=0, column=0, sticky="nsew")
self.start_page.entry.delete(0, tk.END)
self.start_page.entry.insert(0, filename)
self.start_page.entry.config(fg="black")
self.start_page.tkraise()
该处使用容器容纳两个界面
2 StartPage
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent,bg="#fbfbfb")
# controller.configure(bg="white")
self.controller=controller
global font_first
font_first="微软雅黑"
self.entry = tk.Entry(self, fg="gray", width=45,bg="white")
self.entry.insert(0, "Double Button1 Select a File")
self.entry.bind("<Double-Button-1>", self.open_file)
# self.entry.pack(side="left", padx=15, pady=30)
self.entry.grid(row=1, column=0,columnspan=2,padx=15, pady=22,sticky="nsew")
button2 = tk.Button(self, text="Go", command=self.load_page_one,bg="#fbfbfb")
# button2.pack(side="left")
button2.grid(row=1, column=2)
# 创建下拉选择列表
self.combo = ttk.Combobox(self,width=13)
# self.combo.pack(side="bottom",anchor="sw",padx=10)
self.combo.grid(row=2, column=0,padx=15,sticky="w")
# 设置下拉选择列表的选项
self.combo['values'] = font.families()
# 设置默认选中项
self.combo.set(font_first)
# 定义函数,用于获取当前选择的选项
global color_first
color_first="black"
self.entry1 = tk.Entry(self, fg="gray", width=25)
self.entry1.insert(0, "Select or input a font color")
self.entry1.bind("<Double-Button-1>", self.choose_color)
self.entry1.grid(row=2, column=1,padx=15)
self.entry2 = tk.Entry(self, width=3)
self.entry2.insert(0, "0.9")
self.entry2.bind("<Button-1>", self.get_alpha)
self.entry2.grid(row=2, column=2)
self.filename=self.entry.get()
self.controller.attributes("-alpha", float(self.entry2.get()))
3 PageOne
class PageOne(tk.Frame):
def __init__(self, parent, controller, afilename):
tk.Frame.__init__(self, parent,bg="#fbfbfb")
global filename
global current_page
filename=afilename
self.canvas = tk.Canvas(self, width=400, height=60,bg="#fbfbfb")
self.canvas.pack(side="top", fill="both",expand=True)
# self.button = tk.Button(self, text="UP",font=(font_first, 9), command=self.prev_page, width=3, background="white")
self.label = tk.Label(self, bd=1, relief="solid",font=(font_first, 9), background="white", width=12)
# self.button1 = tk.Button(self, text="Down",font=(font_first, 9), command=self.next_page, width=4, background="white")
self.entry = tk.Entry(self ,width=23,font=(font_first, 9),fg="gray")
self.entry.insert(0, "输入页码或章节查询")
self.entry.bind("<FocusIn>", self.on_entry_click)
self.button2 = tk.Button(self,font=(font_first, 9), text="F&B", command=self.find_value,width=4, background="white")
# 显示按钮、标签、文本输入框和按钮
# self.button.pack(side="left", padx=3, pady=1)
self.label.pack(side="left", padx=10, ipadx=3, pady=2)
# self.button1.pack(side="left", padx=5, pady=1)
self.button2.pack(side="right", padx=10, pady=2)
self.entry.pack(side="right", ipadx=2,padx=3, pady=2)
self.controller = controller
self.load_text(filename)
if lines[0] == '\n' or not lines[0].strip().isdigit():
current_page = 1
else:
current_page = lines[0]
# print("current_page",current_page)
# 绑定画布双击事件
self.canvas.bind("<Double-Button-1>", self.hide_all)
self.canvas.bind("<ButtonPress-1>", self.on_drag_start)
self.canvas.bind("<B1-Motion>", self.on_drag_motion)
# 绑定键盘事件
self.controller.bind("<Up>", self.prev_page)
self.controller.bind("<Down>", self.next_page)
#鼠标事件
mouse_thread = threading.Thread(target=lambda: Listener(on_scroll=self.on_scroll).start())
mouse_thread.start()
mouse_thread.join()
self.display_page()
总结
这段代码是一个简单的基于 Tkinter 的 GUI 应用程序的一部分,用于阅读文本文件
SampleApp 类是整个应用程序的主类,继承自 tk.Tk 类。在 __init__ 方法中,它设置了应用程序的基本属性,如标题、大小和容器。然后创建了一个 StartPage 实例,并将其放置在容器中。
StartPage 类是应用程序的起始页面,继承自 tk.Frame 类。在 __init__ 方法中,它创建了一个文本输入框 entry,一个按钮 button2 和一个下拉选择列表 combo。用户可以在文本输入框中双击以选择文件,然后点击按钮来加载选定的文件。下拉选择列表用于选择字体。
PageOne 类表示应用程序的第二个页面,继承自 tk.Frame 类。在 __init__ 方法中,它创建了一个画布 canvas,一个标签 label,一个文本输入框 entry 和一个按钮 button2。这个页面用于显示文件内容,并且用户可以在文本输入框中输入页码或章节来跳转到特定位置。
总体而言,这段代码实现了一个简单的文本阅读应用程序,用户可以选择文件,选择字体,并在文本文件中进行浏览和搜索,以及隐藏窗口等功能