9

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

Community
  • 1
  • 1
kemis
  • 4,404
  • 6
  • 27
  • 40
  • You can't open tkinter windows in the browser, can you? – OneCricketeer Nov 14 '16 at 07:12
  • I can, that part works perfectly – kemis Nov 14 '16 at 07:13
  • 1
    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 Nov 14 '16 at 07:15
  • ooooh :( I didnt know that, the server and the computer I am testing it on are the same so I didnt even think about that, thank you , i will have to research this – kemis Nov 14 '16 at 07:17
  • 1
    Use ``. Tk is a GUI library. Even if you get it to work it wouldn't be a part of the browser. – Abhirath Mahipal Nov 14 '16 at 07:21
  • 1
    @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 Nov 14 '16 at 07:30
  • Name your methods in english, not Czech :P – Jan Černý Mar 21 '19 at 07:24
  • @kemis Yeah... Slavic languages :D I will delete my comments soon. It is very unprofessional. – Jan Černý Mar 21 '19 at 21:06

2 Answers2

7

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
Grey Li
  • 11,664
  • 4
  • 54
  • 64
  • The first one does not work and the second one is like the one I said in my question that worked but I want it to be a button. The redirect works so you get +1 :D I put the button in a form and used action there and it works now, a little stupid but works, thank you – kemis Nov 14 '16 at 07:11
  • You can use CSS to style it. – Grey Li Nov 14 '16 at 07:13
1

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

OneCricketeer
  • 179,855
  • 19
  • 132
  • 245