コード例 #1
0
ファイル: Editor.py プロジェクト: herrlustig/FoxDot
    def __init__(self):

        # Set up master widget

        self.root = Tk()
        self.root.title("FoxDot - Live Coding with Python and SuperCollider")
        self.root.columnconfigure(0, weight=1)
        self.root.rowconfigure(0, weight=2)
        self.root.protocol("WM_DELETE_WINDOW", self.kill)
        self.root.iconbitmap(FOXDOT_ICON)

        # Set font

        if self.default_font not in tkFont.families():

            self.default_font = 'Courier New'

        self.font = tkFont.Font(font=(self.default_font, 12), name="CodeFont")
        self.font.configure(**tkFont.nametofont("CodeFont").configure())

        # Create Y scrollbar

        self.Yscroll = Scrollbar(self.root)
        self.Yscroll.grid(row=0, column=1, sticky='nsew')

        # Create text box for code

        self.text = Text(self.root,
                         padx=5,
                         pady=5,
                         bg=colour_map['background'],
                         fg=colour_map['plaintext'],
                         insertbackground="White",
                         font="CodeFont",
                         yscrollcommand=self.Yscroll.set,
                         width=120,
                         height=20)

        self.text.grid(row=0, column=0, sticky="nsew")
        self.Yscroll.config(command=self.text.yview)
        self.text.focus_set()

        # Docstring prompt label

        self.prompt = StringVar()
        self.promptlbl = Label(self.text, textvariable=self.prompt)
        self.promptlbl.place(x=9999, y=9999)
        self.last_word = ""
        self.prompt.set("")

        # Key bindings

        self.text.bind("<Return>", self.newline)
        self.text.bind("<BackSpace>", self.delete)
        self.text.bind("<Delete>", self.delete2)
        self.text.bind("<Tab>", self.tab)
        self.text.bind("<Key>", self.keypress)

        # Use command key on Mac (Temporary)

        ctrl = "Command" if SYSTEM == MAC_OS else "Control"

        self.text.bind("<{}-Return>".format(ctrl), self.get_code)
        self.text.bind("<{}-a>".format(ctrl), self.selectall)
        self.text.bind("<{}-period>".format(ctrl), self.killall)
        self.text.bind("<{}-v>".format(ctrl), self.paste)
        self.text.bind("<{}-bracketright>".format(ctrl), self.indent)
        self.text.bind("<{}-bracketleft>".format(ctrl), self.unindent)
        self.text.bind("<{}-equal>".format(ctrl), self.zoom_in)
        self.text.bind("<{}-minus>".format(ctrl), self.zoom_out)
        self.text.bind("<{}-z>".format(ctrl), self.undo)
        self.text.bind("<{}-s>".format(ctrl), self.save)
        self.text.bind("<{}-o>".format(ctrl), self.openfile)

        # Change ctrl+h on Mac (is used to close)

        if SYSTEM == MAC_OS:

            self.text.bind("<{}-k>".format(ctrl), self.help)
            self.help_key = "K"

        else:

            self.text.bind("<{}-h>".format(ctrl), self.help)
            self.help_key = "H"

        # Toggle console button keybind

        try:

            self.text.bind("<{}-#>".format(ctrl), self.toggle_console)
            self.toggle_key = "#"

        except:

            self.text.bind("<{}-t>".format(ctrl), self.toggle_console)
            self.toggle_key = "T"

        # Save feature variabes

        self.saved = False
        self.file = None
        self.filename = None

        # Automatic brackets

        self.inbrackets = False
        self.separators = py_separators
        self.left_brackets = left_b
        self.right_brackets = right_b
        self.all_brackets = dict(zip(self.left_brackets, self.right_brackets))
        self.bracket_q = []
        for char in self.left_brackets + self.right_brackets:
            self.text.bind(char, self.brackets)

        # Set tag names and config for specific colours

        for tier in tag_weights:

            for tag_name in tier:

                self.text.tag_config(tag_name, foreground=colour_map[tag_name])

        # Create undo-stack

        self.undo_stack = UndoStack(self.text)

        # Create lable for console

        self.console = console(self.root, self.default_font)
        self.console_visible = True
        sys.stdout = self.console

        # Say Hello to the user

        print "Welcome to FoxDot! Press Ctrl+{} for help.".format(
            self.help_key)
        print "-----------------------------------------"