Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save bhardwajAbhi/2e0d61a5cd7daf8b31d4275a33af947d to your computer and use it in GitHub Desktop.
Save bhardwajAbhi/2e0d61a5cd7daf8b31d4275a33af947d to your computer and use it in GitHub Desktop.
import tkinter as tk
from tkinter import scrolledtext
from tkinter import filedialog
class TextViewer:
def __init__(self, root):
self.root = root
self.root.title("Text Viewer")
self.line_numbers = tk.Text(root, width=4, height=30, bg="lightgray", state="disabled", padx=5)
self.line_numbers.pack(side="left", fill="y")
self.text_area = scrolledtext.ScrolledText(root, wrap=tk.WORD, width=80, height=30, font=("Courier New", 12))
self.text_area.pack(expand=True, fill="both")
self.text_area.bind("<Key>", self.update_line_numbers)
self.text_area.bind("<MouseWheel>", self.update_line_numbers)
self.text_area.bind("<Button-4>", self.update_line_numbers)
self.text_area.bind("<Button-5>", self.update_line_numbers)
self.text_area.bind("<Configure>", self.update_line_numbers_on_configure)
menu_bar = tk.Menu(root)
root.config(menu=menu_bar)
file_menu = tk.Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="File", menu=file_menu)
file_menu.add_command(label="Open", command=self.open_file)
def open_file(self):
file_path = filedialog.askopenfilename(title="Open Text File", filetypes=[("Text files", "*.txt"), ("All files", "*.*")])
if file_path:
with open(file_path, 'r') as file:
content = file.read()
self.text_area.delete(1.0, tk.END)
self.text_area.insert(tk.END, content)
self.update_line_numbers()
def update_line_numbers(self, event=None):
lines = self.text_area.get(1.0, tk.END).split('\n')[:-1] # Exclude last empty line
line_numbers_text = "\n".join(str(i) for i in range(1, len(lines) + 1))
self.line_numbers.config(state="normal")
self.line_numbers.delete(1.0, tk.END)
self.line_numbers.insert(tk.END, line_numbers_text)
self.line_numbers.config(state="disabled")
# Synchronize line numbers with text area scrolling
y_scroll_fraction = self.text_area.yview()[0]
self.line_numbers.yview_moveto(y_scroll_fraction)
def update_line_numbers_on_configure(self, event=None):
# Update line numbers when the text area is resized
self.update_line_numbers()
if __name__ == "__main__":
root = tk.Tk()
text_viewer = TextViewer(root)
root.mainloop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment