Рекурсивные направляющие вложенные ресурсы

Вы можете попробовать это:

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()
6
задан Cameron McCloud 6 October 2008 в 13:05
поделиться

3 ответа

нет никакой причины, у них должны быть порожденные 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.

3
ответ дан 9 December 2019 в 22:42
поделиться

Я в настоящее время нахожусь на проекте, который делает что-то подобное. Ответ, который я использовал, который был очень изящен, был, я добавил 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

2
ответ дан 9 December 2019 в 22:42
поделиться

Движение где угодно вне единственного вложенного маршрута обычно считают плохой идеей.

От страницы 108 направляющих Путь:

"Jamis Облачаются очень влиятельная фигура в сообществе направляющих, почти так же как сам David. В феврале 2007, vis его блог, он в основном сказал нам, что глубокое вложение было _bad_ вещью и предложило следующее эмпирическое правило: Ресурсы никогда не должны вкладываться больше чем один уровень глубоко".

Теперь некоторые спорили бы с этим (который обсужден на странице 109), но когда Вы говорите о вложенных задачах с задачами, это просто, кажется, не имеет много смысла.

Я приблизился бы к Вашему решению, другой путь и как оно был упомянут выше, проект должен иметь много задач, но для задачи иметь много задач не кажется корректным, и возможно они должны быть переименованы как подзадачи или что-то вдоль тех строк.

6
ответ дан 9 December 2019 в 22:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: