Filebrowser and Gcode editor

More
4 years 4 months ago #244480 by cakeslob
I apologize for my ineptitude in advance. Enthusiasm can only get me so far before I have more questions than results.

File browser-

For some reason, the linux tk file browser is not very good. I found a good candidate replacement for it
 

Attachment not found



  github.com/j4321/tkFileBrowser

For implementation into usercommand file, I figured I change the open_file command here
github.com/LinuxCNC/linuxcnc/blob/3b17ed...cripts/axis.py#L2198
Code:
f = root_window.tk.call("tk_getOpenFile", "-initialdir", open_directory, "-filetypes", types)
change this to the new one, and any others i find
probably add something like this to the top, I think I can remove the ttk part
Code:
from tkfilebrowser import askopendirname, askopenfilenames, asksaveasfilename, askopenpathnames try: import tkinter as tk from tkinter import ttk from tkinter import filedialog except ImportError: import Tkinter as tk import ttk import tkFileDialog as filedialog


I have questions as to what I do with the new filebrower files....do I install it (globally?) like it says in the github using pip, or should I be putting all the files into the config folder with the usercommand , and calling on them from there? What is that called and how would I change the import to reflect that?



This next question is about an embedded editor, but also related to the file browser
If I wanted it to not be a dialog but and embedded tab......
Is the reason I cannot embedded because things like genedit, tooledit, this new filedialog, and vismach create a top level window?


github.com/LinuxCNC/linuxcnc/blob/master/tcl/bin/genedit.tcl
github.com/LinuxCNC/linuxcnc/blob/master/tcl/tooledit.tcl

Please Log in to join the conversation.

More
4 years 4 months ago #244578 by cakeslob
At any rate, on the axis editor,
I think I am close, but I run into trouble when trying to get the current file path. here is what I have tried so far. some feel close, but not quite.

if anyone can chime in and point me in the right direction on this, that would be cool.

here are the things Ive tried so far
Code:
import linuxcnc s = linuxcnc.stat() ### we will change this back to w later #### rC = root_window.tk.call ######## doesnt work ################# #open_file=open(os.path.basename(f),'r') #open_file=open(os.path.join(tempdir, os.path.basename(loaded_file)),'r') #open_file=open(os.path.abspath(f),'r') #open_file=open(os.path.exists(initialfile),'r') #open_file=open(os.path.dirname(f),'r') #open_file=open(os.path.(loaded_file),'r') #open_file=open(os.stat(loaded_file),'r') #TypeError: expected str, bytes or os.PathLike object, not os.stat_result ### maybe close ###### #open_file=open(os.access(loaded_file,os.W_OK),'r') # hard crashes axis ########### closest ones i think ##################### #open_file=open(os.path.basename(loaded_file),'r') #FileNotFoundError: [Errno 2] No such file or directory: 'axis.ngc' #open_file=open(s.file(),'r') #TypeError: 'str' object is not callable rC('.pane.top.tabs.fedit.t.text','delete','1.0','end') rC('.pane.top.tabs.fedit.t.text','insert','end','open_file.read()')
Code:
open_file=open(os.path.basename(loaded_file),'r')
this one feels pretty close but I cant figure out what gives me the full path name
Code:
#open_file=open(s.file(),'r')
this one I know outputs the full file path, but it complains

and some of those options....seem to not error, but the text they insert isnt the gcode file, it will insert 'open_file.read()' into my text widget

Please Log in to join the conversation.

More
4 years 4 months ago #244590 by phillc54
I am possibly misunderstanding what you want to do but...
If you are looking for just the path name then you don't need the open command, this should do it:
Code:
file_path = os.path.dirname(loaded_file)
for the file:
Code:
file_name = os.path.basename(loaded_file)
or for both you could also do:
Code:
file_path, file_name = loaded_file.rsplit('/', 1)
 

Please Log in to join the conversation.

More
4 years 4 months ago #244594 by cakeslob
shit i didnt explain what i was trying to do.

Trying to make embeded gcode editor, using a text widget and automatically loading the same file thats loaded into axis, and then on exiting the tab, it saves and reloads the program in axis

I didnt think about combining them, but when i used your example it was complaining about a list instead of a string, which made me think I can test these paths using print

i tried linuxcnc.stat.file again and it didnt print, i was adding brackets s.file() and that was messing it up

Code:
open_file=open(s.file,'r') rC('.pane.top.tabs.fedit.t.text','delete','1.0','end') rC('.pane.top.tabs.fedit.t.text','insert','end','open_filea.read()')

Now I am having an issue with it updating the file when it changes. I put it into user live update, but now it updates too much.
another unforeseen issue is all the keyboard hotkeys going wild when i edit the gcode file. even with takefocus, I did not expect this because i did not have this issue with my search entry widget

Please Log in to join the conversation.

More
4 years 4 months ago #244648 by cakeslob
 

Attachment not found



I have a working in progress editor tab(it looks the same as gcode tab but with broken buttons). I can open, edit and save the current file in axis. I had to do this using keybinds 1 and 2 because for some reason the commands dont work with buttons

problems:

- keybinds still work when text widget is in focus. entry widget works fine but text widget processes all keybinds, making it awful. dont know what to do about this

- from what I understand, the undo causes an issue? what if i have like max undo limit?

- doing a command on tab change, i thought this was an option for notebook but its not. axis does it somehow. trying to load the file only on tab change to edit tab, which would solve my update file problem

- doing a clean exit where it can save and reload the file into axis, and maybe close the file if thats a thing. dont know what i was planning on this one. can you do a command on tab exit some how?

Please Log in to join the conversation.

More
4 years 4 months ago #244654 by phillc54

- doing a command on tab change, i thought this was an option for notebook but its not. axis does it somehow. trying to load the file only on tab change to edit tab, which would solve my update file problem


The following should do this:
Code:
def page_switched(page): print('switched to', page) TclCommands.page_switched = page_switched rC('.pane.top.tabs','bindtabs','<ButtonPress-1>','page_switched')

Please Log in to join the conversation.

More
4 years 4 months ago #244704 by cakeslob
Hey Phil, thanks for helping me out.

I was trying to work with your example, but I keep getting the similar error for that, as I do with my save and openfile commands(when they are not bound to a key). Im getting a similar error when I try to do anything else with tabs. If you can enlightening me on whats going on, this is an issue i face sometimes that I have yet to understand except it works if you bind it to a key.
Also when looking into bindtab, I realised bwidget appears to be better than ttk notebook, bwidget has the tab command thing I was looking for
Code:
def page_switched(page): print('switched to', page) TclCommands.page_switched = page_switched rC('.pane.top.tabs','bindtabs','<ButtonPress-1>',page_switched) #TCL error in asynchronous code: #invalid command name "<function" # while executing #"<function page_switched at 0xaf2dd468> [NoteBook::_get_page_name .pane.top.tabs current 1]" # (command bound to event)

Code:
def load_editfile(self): print (s.file) open_filea = open(s.file,'r') rC('.pane.top.tabs.fedit.t.text','delete','1.0','end') rC('.pane.top.tabs.fedit.t.text','insert','end',open_filea.read()) def save_editfile(self): print (s.file) open_filea = open(s.file,'w') edit_gcode = rC('.pane.top.tabs.fedit.t.text','get','1.0','end') open_filea.write(edit_gcode) return 1 TclCommands.save_editfile = save_editfile TclCommands.load_editfile = load_editfile rC('.pane.top.tabs','insert','end','edit','-text',' edit ','-raisecmd',load_editfile,'-leavecmd',save_editfile) #TCL error in asynchronous code: #invalid command name "<function" # while executing #"<function load_editfile at 0xaf361e88>" # ("uplevel" body line 1) # invoked from within #"uplevel \#0 $cmd" # (procedure "NoteBook::_select" line 34) # invoked from within #"NoteBook::_select .pane.top.tabs edit" # (command bound to event)  

Please Log in to join the conversation.

More
4 years 4 months ago #244712 by phillc54
Have you tried with single quotes around the commands?
'page_switched' or 'save_editfile'
 

Please Log in to join the conversation.

More
4 years 4 months ago #244720 by cakeslob
Yeah, right after I posted I noticed yours had the quotes (sending a command as a string to tcl?), so I tried it with quotes thinking that would do it, but it was the same thing ,for save_editfile at least

Please Log in to join the conversation.

More
4 years 4 months ago #244741 by phillc54
You need to put the quotes around load_editfie as well. Basically everything in a tk.call needs to be text. The following works for me:
Code:
def page_switched(page):     print('switched to', page) def save_editfile():     print('saving', s.file) def load_editfile():     print('loading', s.file) TclCommands.page_switched = page_switched TclCommands.save_editfile = save_editfile TclCommands.load_editfile = load_editfile rC('.pane.top.tabs','bindtabs','<ButtonPress-1>','page_switched') rC('.pane.top.tabs','insert','end','edit','-text',' edit ','-raisecmd','load_editfile','-leavecmd','save_editfile')

Please Log in to join the conversation.

Time to create page: 0.115 seconds
Powered by Kunena Forum