Запуск следующего скрипта Python 3 и по какой-то причине, которую я не могу понять, функция startWebview выполняется дважды, что приводит к открытию двух окон PyWebView.
# Import Modules Here
import os
import time
import webview
import os.path
import multiprocessing
from dotenv import load_dotenv
from flask_wtf import FlaskForm
from flask_mde import Mde, MdeField
from wtforms import SubmitField, StringField
from wtforms.validators import InputRequired, DataRequired, Length
from flask import Flask, request, render_template, flash, session, url_for
app = Flask(__name__)
load_dotenv()
mde = Mde(app)
app.config['SECRET_KEY'] = os.environ.get("FLASK_SECRET_KEY")
windowTitle = os.environ.get("WINDOW_TITLE")
fileDirPath = os.environ.get("FILE_DIRECTORY")
def error_flasher(form):
for field, message_list in form.errors.items():
for message in message_list:
flash(form[field].label.text + ': ' + message, 'error')
print(message, message_list)
def fileHandler(form):
savePath = os.path.join(fileDirPath, form.title.data)
f = open(savePath, "w+")
f.write(form.editor.data)
f.close()
def contentLoader(form):
savePath = os.path.join(fileDirPath, form.title.data)
fileName = savePath
f = open(fileName, "r")
return f.read()
class MdeForm(FlaskForm):
title = StringField('Title', validators=[DataRequired()])
editor = MdeField(
validators=[
#InputRequired("Input required"),
Length(min=0, max=30000)
]
)
submit = SubmitField()
@app.route('/', methods=['GET', 'POST'])
def index():
form = MdeForm()
if form.validate_on_submit() and form.editor.data == "":
form.editor.data = contentLoader(form)
elif form.validate_on_submit() and form.editor.data != "":
session['editor'] = request.form['editor']
fileHandler(form)
form.title.data = ""
form.editor.data = ""
return render_template("index.html", form=form, windowTitle=windowTitle)
def startFlaskServer():
app.run(debug=True)
def startWebview():
webview.create_window(windowTitle, 'http://localhost:5000')
webview.start(debug=True)
if __name__ == "__main__":
p1 = multiprocessing.Process(target=startFlaskServer)
p2 = multiprocessing.Process(target=startWebview)
p1.start()
time.sleep(2)
p2.start()
p2.join()
p1.terminate()
Как видно на изображении выше, может показаться, что причиной являются два запроса GET, поскольку второй Webview загружается только после второго запроса GET.
Заранее спасибо!






Похоже, что эта проблема вызвана многопроцессорной повторной оценкой файла, как это было предложено @Carcigenicate.
Проблема решена путем перехода от многопоточности к многопоточности.
Однако будьте очень осторожны; два пути не эквивалентны. Многопоточность нельзя использовать для одновременного выполнения нескольких инструкций Python. В лучшем случае у вас будет несколько потоков, борющихся за процессорное время на одном ядре, что может привести к задержке при нагрузке. Вместо этого вы можете вернуться к многопроцессорной обработке, выяснить, что конкретно вызывает повторяющееся поведение, и переместить эту часть (или весь нефункциональный код верхнего уровня) в проверку if __name__ == "__main__", поскольку __name__ будет отличаться в порожденный процесс.
@Carcigenicate Обязательно постараюсь найти ошибку. Однако, поскольку документы PyWebview указывают, что многопоточность лучше использовать с их модулем, то это то, к чему я сейчас перешел. Большое спасибо за подсказку!
Я очень мало знаю о Flask, но обратите внимание, что создание процесса приводит к повторной оценке файла в новом процессе. Демонстрация. Я понятия не имею, будет ли этот материал наверху, оцениваемый более одного раза, иметь эффект, который вы описываете, но на это стоит обратить внимание.