Я сделал текстовый редактор с добавленной полосой прокрутки. У меня есть две основные проблемы здесь.
Проблема, с которой я сталкиваюсь, заключается в том, что мой текст не полностью переходит на следующую строку, когда он близко к правой стороне, а последний символ просто прячется под полосой прокрутки. Я хочу слово должно либо перейти на следующую строку, либо символ не должен заходить за полосу прокрутки.
У меня есть возможность смены шрифтов, но список шрифтов не отсортирован и найти конкретный шрифт сложно. Я не знаю, как сделать его отсортированным или лучше, как добавить виджет поиска для выбора определенного шрифта, как в текстовом редакторе Microsoft.
Вот мой код:
import os.path
from tkinter import *
from tkinter import colorchooser, font
from tkinter.messagebox import *
from tkinter.filedialog import *
'''
This is a text editior which can open save make new files
The fonts and color of text is changeable.
'''
def change_color():
color = colorchooser.askcolor(title = "Pick any color")
text_area.config(fg=color[1])
def change_font(*args):
text_area.config(font=(font_name.get(), size_box.get()))
def new_file():
window.title("Untitled")
text_area.delete(1.0, END)
def open_file():
# from filedialog module it gives just the file directry and opening GUI
file_name = askopenfilename(defaultextension = ".txt",
filetypes=[("Text Documents", '.txt'),
("All files",'*.*')])
# if window is closed without selecting a file.
# comparing it to none did not have effect as file is str type
# and has empty string when nothing is selected
if file_name == "":
print("No file was selected")
return
try:
window.title(os.path.basename(file_name))
text_area.delete(1.0, END)
# This builtin open function opens the file in given address
file = open(file_name, 'r')
# writes at start the strings text in file.read()
text_area.insert(1.0, file.read())
except Exception:
print("File could not be opened")
finally:
file.close()
def save_file():
file = asksaveasfilename(initialfile='Untitled.txt',
defaultextension='.txt',
filetypes=[('All files','.*'),
('Text Documents','.txt')])
# if window is closed without selecting a file.
# comparing it to none did not have effect as file is str type
# and has empty string when nothing is selected
if file == "" :
print("No file was selected")
return
try:
window.title(os.path.basename(file))
file = open(file, 'w')
file.write(text_area.get(1.0, END))
except Exception:
print("Could not save file")
finally:
file.close()
def copy():
text_area.event_generate("<<Copy>>") # dont know how this function works
def cut():
text_area.event_generate("<<Cut>>") # dont know how this function works
def paste():
text_area.event_generate("<<Paste>>") # dont know how this function works
def about():
# Using message box modue
howinfo("About this program","This is a text editor")
def close():
window.destroy()
window = Tk()
window.title("Text Editor")
window_height = 500
window_width = 500
# Screen display size of my PC
screen_width = window.winfo_screenwidth()
screen_height = window.winfo_screenheight()
print(screen_width)
print(screen_height)
# To make the window appear in centre.
x = int((screen_width / 2) - (window_width / 2))
y = int((screen_height / 2) - (window_height / 2))
window.geometry('{}x{}+{}+{}'.format(window_width, window_height,x,y))
# default font selection
font_name = StringVar(window)
font_name.set('Arial')
font_size = StringVar(window)
font_size.set("25")
# adding text area to write and attach scroll bar to it.
text_area = Text(window, font=(font_name.get(), font_size.get()))
scrollbar = Scrollbar(text_area)
scrollbar.pack(side=RIGHT, fill=Y)
# adding scroll bar to our text area
text_area.config(yscrollcommand=scrollbar.set)
#This line is making text move by scroll.
scrollbar.config(command=text_area.yview, cursor='arrow')
# This will make text to span when window is expanded or compressed
window.grid_rowconfigure(0, weight=1)
window.grid_columnconfigure(0, weight=1)
text_area.grid(sticky=N + E + S + W)
frame =Frame(window)
frame.grid()
# making color change , spin and font changing buttons
color_button = Button(frame, text = "color", command=change_color)
color_button.grid(row=0,column=0)
# Option menu from font class
font_change = OptionMenu(frame, font_name, *font.families(),
command=change_font)
font_change.grid(row=0, column=1)
#spinbox for changing font size
size_box = Spinbox(frame, from_=1, to=100, textvariable=font_size,
command=change_font)
size_box.grid(row=0, column=2)
#menu tabs
menu_bar = Menu(window)
window.config(menu=menu_bar)
# File menu
file_menu = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label = "File", menu=file_menu)
file_menu.add_command(label = "New File", command=new_file)
file_menu.add_command(label = "Open", command=open_file)
file_menu.add_command(label = "Save", command=save_file)
file_menu.add_separator()
file_menu.add_command(label = "Exit", command=close)
# Edit menu
edit_menu = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label = "Edit", menu=edit_menu)
edit_menu.add_command(label = "copy", command=copy)
edit_menu.add_command(label = "paste", command=paste)
edit_menu.add_command(label = "cut", command=cut)
edit_menu.add_separator()
# help menu
help_menu = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label='help', menu=help_menu)
help_menu.add_command(label='About', command=about)
window.mainloop()
Проблемная картинка:
@BryanOakley извините за публикацию всего моего кода. Я новичок в том, чтобы задавать вопросы. Я буду следовать лучшим практикам.
Для проблемы 1 вам нужно поместить полосу прокрутки в window
вместо text_area
:
text_area = Text(window, font=(font_name.get(), font_size.get()))
scrollbar = Scrollbar(window)
...
text_area.grid(row=0, column=0, sticky=N+E+S+W)
scrollbar.grid(row=0, column=1, sticky=N+S)
Для проблемы 2 вы можете отсортировать список, используя sorted()
:
font_change = OptionMenu(frame, font_name, *sorted(font.families()),
command=change_font)
я попробовал ваше решение для проблемы 1. но теперь функция прокрутки не работает. он не прокручивает текст. если я добавлю следующую строку, теперь прокрутку можно перемещать, но она не перемещает панорамирование текста. #Эта строка заставляет текст перемещаться по прокрутке. scrollbar.config(command=text_area.yview, cursor='arrow') Однако функция сортировки работала, я пробовал и раньше, но использовал ее неправильно. спасибо за второе решение.
Мое решение для проблемы 1 просто меняет родителя полосы прокрутки и не влияет на поведение полосы прокрутки.
Я только что проверил ваш код со своими изменениями, он отлично работает в моей среде Python 3.10.2.
Пожалуйста, задавайте только один вопрос за раз и убедитесь, что ваш код минимален. Например, ничто в этом вопросе не требует строки меню или большинства функций.