Вы можете попробовать это:
from tkinter import Tk, scrolledtext, Menu, filedialog, END, messagebox, simpledialog, StringVar
root = Tk(className=" Text Editor")
textArea = scrolledtext.ScrolledText(root, width=100, height=80)
# --- added extra code for getting key pressed starts here --- #
word = ''
text = ''
def key(event):
# if you only need the character of the key pressed #
print("You Pressed: ", event.char)
# if you need the words after pressing ' '(space) key, or the total text #
global word, text
if event.char == ' ':
text = text + ' ' + word
print("Current Word You Entered: ", word)
print("Total Text is: ", text)
word = ''
else:
word += event.char
# binding key function to key pressed #
textArea.bind("<Key>", key)
# --- added extra code for getting key pressed ends here --- #
def newFile():
if len(textArea.get('1.0', END+'-1c')) > 0:
if messagebox.askyesno("Save ?", "Do you wish to save ?"):
saveFile()
else:
textArea.delete('1.0', END)
root.title("TEXT EDITOR")
def openFile():
textArea.delete('1.0', END)
file = filedialog.askopenfile(parent=root, mode='rb', title='Select a text file', filetypes=(("Text file", "*.txt"), ("All files", "*.*")))
if file != None:
contents = file.read()
textArea.insert('1.0', contents)
file.close()
def saveFile():
file = filedialog.asksaveasfile(mode='w')
if file != None:
data = textArea.get('1.0', END+'-1c')
file.write(data)
file.close()
menu = Menu(root)
root.config(menu=menu)
fileMenu = Menu(menu)
menu.add_cascade(label="File", menu=fileMenu)
fileMenu.add_command(label="New", command=newFile)
fileMenu.add_command(label="Open", command=openFile)
fileMenu.add_command(label="Save", command=saveFile)
fileMenu.add_command(label="Find")
fileMenu.add_separator()
fileMenu.add_command(label="Exit")
helpMenu = Menu(menu)
menu.add_cascade(label="Help")
menu.add_cascade(label="About")
textArea.pack()
root.mainloop()
нет никакой причины, у них должны быть порожденные URL.
логически:
/projects/1 --> project 1 /projects/1/edit ( etc ) /tasks/1 --> task 1 /project/1/tasks --> task list for project 1 /project/1/tasks/new /project/1/tasks/1/edit -> /tasks/5/edit ( redundancy ) /project/1/tasks/1 -> redirect to /tasks/1 /tasks/1/project -> redirect to /projects/1 /tasks/3/tasks --> list of tasks that are children tasks of task 3 /tasks/3/tasks/5 -> redirect /tasks/5/ ( because you don't really need to have a recursive URL ) /tasks/5/parents -> list of tasks that are parents of tasks 3 /tasks/5/parents/3 -> redirect /tasks/3/
нет никакой причины, по моему скромному мнению, для требования URL быть ассоциативной, Вы не испытываете необходимость, чтобы знать, что задачей 5 является ребенок задачи 3 отредактировать задачу 5.
Я в настоящее время нахожусь на проекте, который делает что-то подобное. Ответ, который я использовал, который был очень изящен, был, я добавил parent_id столбец, который указал на другую задачу. При выполнении модели удостоверьтесь, что сделали следующее:
belongs_to :project
belongs_to :parent, :class_name => "Task"
has_many :children, :class_name => "Task", :foreign_key => "parent_id"
... и затем можно сделать рекурсию:
def do_something(task)
task.children.each do |child|
puts "Something!"
do_something(child)
end
end
Таким образом, можно сослаться задачи его родителем или его детьми. При выполнении маршрутов Вы будете всегда получать доступ к единственной задаче
/project/:project_id/task/:task_id
даже при том, что это может иметь родителя или детей.
Просто удостоверьтесь, что у Вас нет задачи, которая имеет ее родителя то же как ее ребенок, или иначе Вы войдете в бесконечный цикл, когда Вы сделаете свою рекурсию для нахождения всех детей. Можно добавить условие к сценариям проверки, чтобы удостовериться, что оно не делает.
См. также: acts_as_tree
Движение где угодно вне единственного вложенного маршрута обычно считают плохой идеей.
От страницы 108 направляющих Путь:
Теперь некоторые спорили бы с этим (который обсужден на странице 109), но когда Вы говорите о вложенных задачах с задачами, это просто, кажется, не имеет много смысла.
Я приблизился бы к Вашему решению, другой путь и как оно был упомянут выше, проект должен иметь много задач, но для задачи иметь много задач не кажется корректным, и возможно они должны быть переименованы как подзадачи или что-то вдоль тех строк.