Posted to tcl by hardkorebob at Wed Aug 05 20:09:24 GMT 2026view raw
- source ytcl.tcl
-
- set BG {bg="#bbb"}
- set TEXT_PACK {expand=1,side="left",fill="both",padx=0,pady=0}
- set CLI_PACK {expand=0,fill="x",padx=2,pady=2}
- set TEXT_PROP {self,wrap="none",undo=True,highlightbackground="#bbb",bg="#bbb",fg="#000",font=("VictorMono",14),relief="flat",padx=5,pady=5,blockcursor=True,insertbackground="red",highlightcolor="#bbb",cursor="cross",spacing2=5,spacing3=5,selectbackground="#444",selectforeground="white"}
- set CLI_PROP {self,textvariable=self.theCmd,highlightbackground="#bbb",bg="#aaa",fg="#000",font=("VictorMono",16),relief="flat",highlightcolor="#bbb",cursor="heart",selectbackground="#444",selectforeground="white"}
- set STATS_PROP {self,textvariable=self.insPos,relief="flat",bg="#bbb",fg="#000",font=("VictorMono",14)}
- set STATS_PACK {expand=0,fill="none",padx=5,pady=2,anchor="nw"}
- set PYTXT_PROP {self,height="2",textvariable=self.pyTxt,relief="flat",bg="#bbb",fg="#000",font=("VictorMono",14)}
- set PYTXT_PACK {expand=0,fill="none",padx=5,pady=2,anchor="nw"}
- set PBP {self,mode="determinate",orient="horizontal",length="1000",style="TProgressbar"}
-
- bang
- imp subprocess
- frm math *
- frm tkinter Tk,Entry,Text,Frame,Label,StringVar
- frm tkinter.ttk Progressbar,Style
-
- cl App Tk
- +
- df s __init__
- +
- fc l {super().__init__}
- fc s configure $BG
- vf s main MainWin self
- fc s main.pack $TEXT_PACK
- fc s main.bind_all {"<Control-t>", self.newFrame}
- fc s main.bind_all {"<Control-T>", self.delFrame}
- -
-
- de s newFrame
- +
- vf s sec MainWin self
- fc s sec.pack $TEXT_PACK
- fc s main.goCli
- -
-
- de s delFrame
- +
- fc s sec.destroy
- -
- -
-
- cl MainWin Frame
- +
- df s __init__ parent
- +
- fc l {super().__init__} parent
- va s master parent
- fc s configure $BG
- vf s theCmd StringVar
- vf s insPos StringVar
- vf s pyTxt StringVar
- vf s py_label Label $PYTXT_PROP
- fc s py_label.pack $PYTXT_PACK
- vf s pos_label Label $STATS_PROP
- fc s pos_label.pack $STATS_PACK
- vf s cli_entry Entry $CLI_PROP
- fc s cli_entry.pack $CLI_PACK
- vf s total_pb Progressbar $PBP
- fc s total_pb.pack $CLI_PACK
- vf s main_text Text $TEXT_PROP
- fc s main_text.pack $TEXT_PACK
- vf s style Style self
-
- bd s main_text {
- <Escape> goCli
- <Tab> indent
- <Key> autoComplete
- }
-
- bd s cli_entry {
- <Up> lineUp
- <Down> lineDown
- <Escape> clearCmd
- <F5> runPy
- <Return> mainSend
- <Shift-Return> newLine
- <Control-Return> showPy
- <Control-j> mainfontSize
- <Control-o> openFile
- <Control-O> openSelf
- <Control-s> saveFile
- <Control-l> clearText
- <Control-f> findWord
- <Control-n> newFile
- }
-
- fc s style.configure {"TProgressbar",thickness=5}
- fc s main_text.config {yscrollcommand=self.trackScroll}
- fc s main_text.tag_configure {"currline", background="#aaa"}
- fc s main_text.tag_configure {"found", background="#ddd"}
-
- fc s newFile
- fc s cli_entry.focus
- -
-
- de s newFile
- +
- va s file_name {"empty"}
- fc s clearCmd
- fc s clearText
- -
-
- df s subProc w,cmd
- +
- ytr
- +
- vf l output subprocess.run {cmd,shell=True,executable="/bin/bash",stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True}
- ff l {w == "main"}
- +
- ff l output.returncode {== 0}
- +
- fc s main_text.insert {"insert",f"\n{output.stdout}\n"}
- -
- el
- +
- fc s clearText
- fc s main_text.insert {"insert",output.stderr}
- -
- -
- ef l {w == "sec"}
- +
- fc s master.sec.main_text.insert {"1.0",output.stdout}
- -
- el
- +
- fc s pyTxt.set {output.stdout}
- -
- -
- exc
- +
- fc s main_text.insert {"1.0",str(e)}
- -
- -
-
- de s showPy
- +
- fc s subProc {"sec", f"tclsh {self.file_name}"}
- -
-
- de s runPy
- +
- fc s main_text.mark_set {"insert","end"}
- fc s subProc {"main",f"tclsh {self.file_name} | python3"}
- fc s main_text.mark_set {"insert","1.0"}
- -
-
- de s goCli
- +
- fc s cli_entry.focus
- fc s seeLine
- -
-
- de s clearText
- +
- fc s main_text.delete {"1.0", "end-1c"}
- fc s countWords
- -
-
- de s clearCmd
- +
- fc s theCmd.set "''"
- fc s main_text.tag_remove {"found","1.0","end"}
- -
-
- de s newLine
- +
- fc s main_text.insert {"insert", f"\n"}
- fc s clearCmd
- fc s countWords
- -
-
- de s getLine
- +
- vf k line main_text.get {"insert linestart","insert lineend"}
- rt line
- -
-
- de s delLine
- +
- vf k line main_text.delete {"insert linestart","insert lineend"}
- -
-
- de s highlightLine
- +
- fc s main_text.tag_remove {"currline","1.0","end"}
- fc s main_text.tag_add {"currline","insert linestart","insert lineend"}
- -
-
- de s checkLine
- +
- vf k curline getLine
- fc s theCmd.set {f"{curline}"}
- fc s highlightLine
- -
-
- de s seeLine
- +
- fc s main_text.see {"insert"}
- fc s countWords
- -
-
- de s lineUp
- +
- vf k currline main_text.mark_set {"insert", "insert - 1 line"}
- fc s checkLine
- fc s seeLine
- -
-
- de s lineDown
- +
- vf k line main_text.mark_set {"insert", "insert + 1 line"}
- fc s checkLine
- fc s seeLine
- -
-
- de s mainSend
- +
- vf k cmd theCmd.get
- fc s delLine
- ff l {cmd[:2] == "s "}
- +
- vf l c {cmd[2:].strip}
- fc s subProc {"main",f"{c}"}
- fc s main_text.mark_set {"insert","1.0"}
- fc s seeLine
- -
- ef l {cmd[:2] == "e "}
- +
- vf l c {cmd[2:].strip}
- ytr
- +
- vf l expr eval c
- fc s main_text.insert {"insert",f"\n{expr}\n"}
- fc s main_text.mark_set {"insert","1.0"}
- fc s seeLine
- -
- exc
- +
- fc s main_text.insert {"insert",f"\n{e}\n"}
- fc s main_text.mark_set {"insert","1.0"}
- fc s seeLine
- -
- -
- el
- +
- fc s main_text.insert {"insert", cmd}
- fc s seeLine
- -
- rt {"break"}
- -
-
- de s openIt
- +
- wi a open {file_name,"r"} file
- +
- vf l data file.read
- fc l file.close
- -
- fc s clearText
- fc s main_text.insert {"1.0",data}
- fc s main_text.mark_set {"insert","1.0"}
- fc s countWords
- -
-
- de s openFile
- +
- vf t file_name theCmd.get
- ff s {file_name == ""}
- +
- fc s pyTxt.set {"can't open empty!"}
- ps
- -
- fc s clearCmd
- fc s openIt
- -
-
- de s openSelf
- +
- va s file_name {"newed"}
- fc s openIt
- -
-
- de s saveFile
- +
- ff s file_name {== "empty"}
- +
- vf t file_name theCmd.get
- fc s clearCmd
- -
- vf k data main_text.get {"1.0","end-1c"}
- wi a open {file_name,"w"} file
- +
- fc l file.write data
- fc l file.close
- -
- fc s countWords
- fc s pyTxt.set {"saved"}
- -
-
- de s seePy
- +
- vf k data getLine
- va l f {".tmp"}
- wi l open {f,"w"} file
- +
- fc l file.write {f"source ytcl.tcl\n{data}\n"}
- fc l file.close
- -
- fc s subProc {"l",f"tclsh {f}"}
- -
-
- df s trackScroll {top,bottom}
- +
- fc s total_pb.configure {maximum=100}
- vf l bot_perc float {bottom} {* 100}
- va s {total_pb['value']} bot_perc
- -
-
- de s mainfontSize
- +
- vf k sz theCmd.get
- vf l fsz int sz
- fc s main_text.configure {font=("VictorMono",fsz)}
- fc s clearCmd
- -
-
- de s findWord
- +
- vf k word theCmd.get
- ff l word {== ""}
- +
- fc s pyTxt.set {"empty"}
- -
- el
- +
- va l si {"1.0"}
- va l tot 0
- fc s main_text.tag_remove {"found","1.0","end"}
- wh True
- +
- vf k si main_text.search {word, si, "end"}
- ff l not si
- +
- br
- -
- va l ei {f"{si}+{len(word)}c"}
- fc s main_text.tag_add {"found",si,ei}
- va l si ei
- ac l tot 1
- -
- fc s pyTxt.set {f"{tot} found: {word}"}
- -
-
- -
-
- de s countWords
- +
- vf t ins_pos main_text.index {"insert"}
- vf k data main_text.get {"1.0","end"}
- vf l words_counted data.split
- vf l lines_counted data.split {"\n"}
- vf l lns len lines_counted
- vf l wrds len words_counted
- fc s insPos.set {f"{self.ins_pos} {self.file_name} : {wrds} | {lns-1}"}
- fc s seePy
- fc s total_pb.configure {maximum=lns}
- vf k spltpos ins_pos.split {'.'}
- vf l inspos int {spltpos[0]}
- va s {total_pb['value']} inspos
- -
-
- de s indent
- +
- vf k cursor_pos main_text.index {"insert"}
- fc s main_text.insert {cursor_pos, f"+\n\n-"}
- fc s main_text.mark_set {"insert", f"{cursor_pos} + 1 line"}
- rt {"break"}
- -
-
- de s autoComplete
- +
- vf k cursor_pos main_text.index {"insert"}
- ff - {event.char == "'"}
- +
- fc s main_text.insert {cursor_pos, "'"}
- -
- ef - {event.char == "<"}
- +
- fc s main_text.insert {cursor_pos, ">"}
- fc s main_text.mark_set {"insert", cursor_pos}
- -
- ef - {event.char == "("}
- +
- fc s main_text.insert {cursor_pos, ")"}
- fc s main_text.mark_set {"insert", cursor_pos}
- -
- ef - "event.char == \"\{\""
- +
- fc s main_text.insert "cursor_pos, \"}\""
- fc s main_text.mark_set {"insert", cursor_pos}
- -
- ef - {event.char == "["}
- +
- fc s main_text.insert {cursor_pos, "]"}
- fc s main_text.mark_set {"insert", cursor_pos}
- -
- ef - {event.char == '\"'}
- +
- fc s main_text.insert {cursor_pos, '\"'}
- fc s main_text.mark_set {"insert", cursor_pos}
- -
- -
- mn App tclyed
-
-
-
-
-
Add a comment