Tkinter is adding newlines every 30 seconds:
Unwanted newlines
I'm running this in windows CMD.
I wrote a simple program to test this with a single askopenfilename() call in there.
When I click the browse button, it adds a newline, then after I choose the file and click begin, it adds a newline every 30 seconds while the program is "running":
import tkinter as tk
from tkinter import filedialog
from tkinter.filedialog import askdirectory
import time
def input1():
input1_path = tk.filedialog.askopenfilename()
input1_entry.delete(1, tk.END) # Remove current text in entry
input1_entry.insert(0, input1_path) # Insert the 'path'
#returns file paths for the input files and output directory
def begin():
global inputFileName
inputFileName = input1_entry.get()
master.destroy()
master = tk.Tk()
master.title('Omega NExT Archive Plotter')
one_frame = tk.Frame(master)
two_frame = tk.Frame(master)
line1 = tk.Frame(master, height=1, width=400, bg="grey80", relief='groove')
input1_path = tk.Label(one_frame, text="Archive File Input:")
input1_entry = tk.Entry(one_frame, text="", width=60)
browse1 = tk.Button(one_frame, text="Browse", command=input1)
begin_button = tk.Button(two_frame, text='Begin!', command=begin)
one_frame.pack(side=tk.TOP)
line1.pack(pady=10)
two_frame.pack(side=tk.BOTTOM)
input1_path.pack()
input1_entry.pack()
browse1.pack(pady=10)
begin_button.pack(pady=20, fill=tk.X)
master.mainloop()
time.sleep(1000000)
So I have other guys I work with running this on their computers, and it sounds like the problem is happening on our "managed" computers, but not the "less-than-managed" computers. It sounds like some kind of weird IT issue.
I am trying to make a script that reads constantly and updates it on a Tkinter GUI, with a simple button to refresh, but I can't seem to make it work.
I have used the while True to loop to read the file but that doesn't work, it only reads once and then it probably ends with the root.mainloop() line. Any solutions for me?
Code I have written so far:
from tkinter import *
root = Tk()
root.geometry("400x400")
while True:
with open('door1.txt', 'r') as f:
f_contents = f.read()
f.close
def something():
global my_label
my_label.config(text=f_contents)
my_label = Label(root, text="this is my first text")
my_label.pack(pady=10)
my_buttton = Button(root, text="C",command=something)
my_buttton.pack(pady=10)
root.mainloop()
Remove the while loop,
place the reading part in the something function,
remove f.close() because that is what context manager does automatically when exiting it.
Don't use * when importing modules, import what you need or import module (where module is the module name you need to import).
You don't need to use global my_label, it is already a globally accessible name and you are not changing what the name refers to.
Also you may want to put the function outside of the GUI parts so that they are kept separate and the code is more readable.
from tkinter import Tk, Label, Button
def something():
with open('door1.txt', 'r') as f:
f_contents = f.read()
my_label.config(text=f_contents)
root = Tk()
root.geometry("400x400")
my_label = Label(root, text="this is my first text")
my_label.pack(pady=10)
my_buttton = Button(root, text="C", command=something)
my_buttton.pack(pady=10)
root.mainloop()
I'm trying to make tkinter input box to create a file using os' "touch". Code attached down below. Instead of creating the named file, it gives me the following message:
TypeError: cannot concatenate 'str' and 'instance' objects
I have tried the os.system lines with # before them, but it did nothing. Could anyone please tell me what I need to fix to get this working?
My operating system is MacOS if that is important.
from tkinter import *
import os
os.system("clear")
root = tk.Tk()
def createFile():
#os.system("cd ~")
os.system("touch" + e1)
#os.system.pack()
e1 = Entry(root)
e1.pack()
button1 = Button(root, text="Create File", command=createFile)
button1.pack()
root.mainloop()```
The reason is that you are trying to concatenate 'touch' string with an Entry object. You should get the entry text first by using .get method. Also, there should be a space after touch probably, i.e. touch . And in general, why do you need system? For example, in Windows the touch command would fail. There is open function in Python for creating and reading files. Also I would recommend not to use * in import. A linter (for example pylint) would complain about this approach.
The code I suggest is:
import tkinter as tk
import os
os.system("clear")
root = tk.Tk()
def createFile():
# os.system("touch " + e1.get())
# I suggest this:
file = open(e1.get(), 'w')
file.close()
e1 = tk.Entry(root)
e1.pack()
button1 = tk.Button(root, text="Create File", command=createFile)
button1.pack()
root.mainloop()
The purpose of my code is to create a GUI that has 4 buttons. 2 of them are to open a "browse" window, allowing the user to select a file from a directory. The third button is to allow the user to choose a directory for the final document to be outputted to. The fourth button applies my python code to both files, creating the outputted document.
In attempting to create the "browse" buttons, through many posts here on stackoverflow and on the internet, most solutions include the "askopenfilename" module that is often imported from tkFileDialog. However no matter how I word it, or whatever variations of tkinter modules that i import, I consistently receive the same error messages of "no module name tkfileDialog" or "askopenfilename is not defined".
Am I doing something wrong with my code? Is this a common error found in tkinter with python 3.6? How would one go about creating a browse button that finds a file and adds its path?
Please let me know!
Thanks.
Below is my code:
import os
#from tkFileDialog import *
from tkinter import filedialog
from Tkinter import *
from tkfileDialog import askopenfilename
content = 'apple'
file_path = 'squarebot'
#FUNCTIONS
def browsefunc(): #browse button to search for files
filename = askopenfilename()
infile = open(filename, 'r')
content = infile.read()
pathadd = os.path.dirname(filename)+filename
pathlabel.delete(0, END)
pathlabel.insert(0, pathadd)
return content
def open_file(): #also browse button to search for files - im trying various things to get this to work!
global content
global file_path
#filename = filedialog.askopenfilename(filetypes = (typeName {.txt},))
filename = askopenfilename()
infile = open(filename, 'r')
content = infile.read()
file_path = os.path.dirname(filename)
entry.delete(0, END)
entry.insert(0, file_path)
return content
def process_file(content): #process conversion code
print(content)
def directoryname():
directoryname = filedialog.askdirectory() # pick a folder
#GUI
root = Tk()
root.title('DCLF Converter')
root.geometry("598x600")
mf = Frame(root)
mf.pack()
f1 = Frame(mf, width=600, height=250) #DC file
f1.pack(fill=X)
f2 = Frame(mf, width=600, height=250) #LF file
f2.pack(fill=X)
f3 = Frame(mf, width=600, height=250) #destination folder
f3.pack(fill=X)
f4 = Frame(mf, width=600, height=250) #convert button
f4.pack()
file_path = StringVar
Label(f1,text="Select Your DC File (Only txt files)").grid(row=0, column=0, sticky='e') #DC button
entry = Entry(f1, width=50, textvariable=file_path)
entry.grid(row=0,column=1,padx=2,pady=2,sticky='we',columnspan=25)
Label(f2,text="Select Your LF File (Only csv files)").grid(row=0, column=0, sticky='e') #LF button
entry = Entry(f2, width=50, textvariable=file_path)
entry.grid(row=0,column=1,padx=2,pady=2,sticky='we',columnspan=25)
Label(f3,text="Select Your Destination Folder").grid(row=0, column=0, sticky='e') #destination folder button
entry = Entry(f3, width=50, textvariable=directoryname)
entry.grid(row=0,column=1,padx=2,pady=2,sticky='we',columnspan=25)
Button(f1, text="Browse", command=browsefunc).grid(row=0, column=27, sticky='ew', padx=8, pady=4)#DC button
Button(f2, text="Browse", command=browsefunc).grid(row=0, column=27, sticky='ew', padx=8, pady=4)#LF button
Button(f3, text="Browse", command=browsefunc).grid(row=0, column=27, sticky='ew', padx=8, pady=4)#destination folder button
Button(f4, text="RECONCILE NOW", width=32, command=lambda: process_file(content)).grid(sticky='ew', padx=10, pady=10)#convert button
root.mainloop()
P.S If you have found any other errors in my code please let me know. I am just starting with tkinter, and as such this may be attributed to something completely unrelated!
Much Appreciated
This is what I use in my code so it will work with the Tkinter module in both Python 2 and 3:
try:
import Tkinter as tk
import ttk
from tkFileDialog import askopenfilename
import tkMessageBox
import tkSimpleDialog
from tkSimpleDialog import Dialog
except ModuleNotFoundError: # Python 3
import tkinter as tk
from tkinter import ttk
from tkinter.filedialog import askopenfilename
import tkinter.messagebox as tkMessageBox
import tkinter.simpledialog as tkSimpleDialog
from tkinter.simpledialog import Dialog
You asked to be notified any of other errors and I noticed the way you're using askopenfilename doesn't look right. Specifically, the filetypes keyword argument should be a sequence of two-element tuples containing file type names and patterns that will select what appears in the file listing. So for text files you would use:
filename = askopenfilename(filetypes=[('text files', '*.txt')])
I usually also include a generic pattern to allow easy access to files with other extensions thusly:
filename = askopenfilename(filetypes=[('text files', '*.txt'), ("all files", "*")])
Either way, it's important to remember to check the value returned because it might be the empty string it the user didn't select anything.
The problem was actually that I needed to append askopenfilename() to filedialog as mentioned by Roars in a now deleted comment!(it looks like this --> filedialog.askopenfilename().
The module name is misnamed.
Since the python version is 3.6 you need to use filedialog library. The includes should look something like this:
import os
from tkinter import *
import tkinter.filedialog
or
import os
from tkinter import *
from tkinter import filedialog
You can try this:
from tkinter.filedialog import askopenfilename
I'm a newbie on tkinter, my code can run but I need my text widget to display only the result variable in the callback() function not including the 'askopenfilename' method.
from Tkinter import *
from tkFileDialog import *
import os
root = Tk()
root.geometry('900x700')
path = StringVar()
#browse pdf files
def callback():
f = askopenfilename(title='Open Files',initialdir='C:\Users\shantini\Desktop\PDF',
filetypes=[('Files of type:','*.PDF'),('Files of type:','*.pdf')])
path.set(f)
result = os.popen('pdfid.py'+' '+f).read()
return result
#labelframe(text pdf output)
label=LabelFrame(root, text="PDF Analysis Output")
label.pack(side=BOTTOM, anchor=W, fill=BOTH, expand=YES)
text = Text(label,bg='white')
text.pack(fill=BOTH, expand=YES)
text.insert(INSERT,callback())
root.mainloop()
If you disable Text widget, you make it read-only, so you cant add text to it. So to add text, make it normal, or remove the state parameter. I changed your callback to reflect the comments:
def callback():
f = askopenfilename(title='Open Files',initialdir='/tmp',
filetypes=[('Files of type:','*.PDF'),('Files of type:','*.pdf')])
result = open(f).read() # I also changed this as I dont have `pdfid.py` to test the code
text_area.insert(INSERT, result)
print result
I slightly change the input files and folder, as I work in linux and cant use windows paths. Hope this helps.