9
votes

I want to be able to click on a button in html and call a python function. I have tried this and it works but only for text. And I have seen here that you can use the function name in action for buttons but it does not work and I dont know why :/

And I dont want after the click of the button go to to another page, I want to stay on the same page and just execute the code from the function.

my py file :

from flask import Flask
from flask import render_template
import tkinter as tk
from tkinter import filedialog
import sys
app = Flask(__name__)

@app.route('/')
def hello_world():
    return render_template('hello.html')

@app.route('/upload/')
def uploaduj():
    root = tk.Tk()
    root.withdraw()
    file_path = filedialog.askopenfilename()
    return file_path

my html file:

<!doctype html> 
<title>Flaskr</title> 
<link rel=stylesheet type=text/css href="{{ url_for('static', filename='style.css') }}"> 
<div class=page>   
<h1>Flaskr</h1>   
<div class=metanav>   
<button action="/upload/">Klik</button> 
</div>

I am really new to python and flask so every help is appreciated.

EDIT: i now know that tkinter will not work in web browsers

2
You can't open tkinter windows in the browser, can you? - OneCricketeer
I can, that part works perfectly - kemis
Really? It looks like you're making the server open a file dialog. This shouldn't work if the server is on another computer - OneCricketeer
Use <input type='file'>. Tk is a GUI library. Even if you get it to work it wouldn't be a part of the browser. - Abhirath Mahipal
@MilosRadosavljevic TkInter is NOT a web UI library. It is not meant to be used with web applications. It might appear to work in your case, but actually it will never work with web applications. Also, is action a custom attribute you are trying to attach to button, because button elements do not have an action attribute. - sid-m

2 Answers

7
votes

Try this:

<button action="{{ url_for('uploaduj') }}">Klik</button> 

or just use a tag:

<a href="{{ url_for('uploaduj') }}">Klik</a> 

To avoid page redirect, you can use this :

return (''), 204
1
votes

You want an HTML file input dialog.

<form action="/upload">
    <input type="file" name="fileupload" value="fileupload" id="fileupload">
    <label for="fileupload"> Select a file to upload</label>
    <input type="submit" value="Klik">
</form>

How you handle that in Flask, is in the documentation