Created
January 30, 2024 05:31
-
-
Save bhardwajAbhi/2e0d61a5cd7daf8b31d4275a33af947d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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