flask和pyqt结合,写一个上传文件的程序
时间: 2024-06-09 09:11:56 浏览: 262
好的,下面是一个简单的示例程序,使用 Flask 和 PyQt5 实现上传文件功能:
```python
# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QLineEdit, QFileDialog, QVBoxLayout
from PyQt5.QtGui import QIcon
import requests
import os
from flask import Flask, request, jsonify
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads'
class FileUploader(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 设置窗口标题和图标
self.setWindowTitle('File Uploader')
self.setWindowIcon(QIcon('icon.png'))
# 创建控件
self.label = QLabel('上传文件:')
self.file_path = QLineEdit()
self.browse_button = QPushButton('浏览')
self.upload_button = QPushButton('上传')
self.status_label = QLabel()
# 设置控件样式
self.browse_button.setStyleSheet('background-color: #00BFFF; color: white;')
self.upload_button.setStyleSheet('background-color: #00BFFF; color: white;')
# 设置控件大小和位置
self.label.setFixedSize(70, 20)
self.file_path.setFixedSize(250, 20)
self.browse_button.setFixedSize(70, 20)
self.upload_button.setFixedSize(70, 20)
self.status_label.setFixedSize(400, 20)
self.label.move(20, 20)
self.file_path.move(100, 20)
self.browse_button.move(360, 20)
self.upload_button.move(440, 20)
self.status_label.move(20, 60)
# 添加控件到布局
layout = QVBoxLayout()
layout.addWidget(self.label)
layout.addWidget(self.file_path)
layout.addWidget(self.browse_button)
layout.addWidget(self.upload_button)
layout.addWidget(self.status_label)
# 设置布局
self.setLayout(layout)
# 信号连接槽函数
self.browse_button.clicked.connect(self.browse)
self.upload_button.clicked.connect(self.upload)
def browse(self):
# 打开文件对话框
file_path, _ = QFileDialog.getOpenFileName(self, '选择文件', os.getcwd(), 'All Files (*)')
self.file_path.setText(file_path)
def upload(self):
# 获取文件路径
file_path = self.file_path.text()
if not file_path:
self.status_label.setText('请选择文件')
return
# 发送上传请求
file_name = os.path.basename(file_path)
url = 'http://127.0.0.1:5000/upload'
files = {'file': (file_name, open(file_path, 'rb'), 'application/octet-stream')}
response = requests.post(url, files=files)
if response.status_code == 200:
self.status_label.setText('上传成功')
else:
self.status_label.setText('上传失败')
# 清空文件路径
self.file_path.setText('')
@app.route('/upload', methods=['POST'])
def upload():
file = request.files['file']
file.save(os.path.join(app.config['UPLOAD_FOLDER'], file.filename))
return jsonify({'status': 'ok'})
if __name__ == '__main__':
app.run(debug=True)
```
在这个程序中,我们使用了 Flask 来实现文件上传功能,PyQt5 来实现用户界面。用户可以通过浏览按钮选择要上传的文件,然后点击上传按钮进行上传。上传的文件保存在 `uploads` 文件夹中。
注意:在运行程序之前,需要先创建 `uploads` 文件夹。可以在程序启动之前加入以下代码:
```python
if not os.path.exists('uploads'):
os.makedirs('uploads')
```
另外,由于 Flask 和 PyQt5 都是使用事件循环机制来处理事件,所以在程序中需要使用两个事件循环。在这个示例程序中,我们使用了 Flask 自带的 Web 服务器,所以只需要在主线程中启动 Flask 的事件循环即可。如果使用其他 Web 服务器,需要在另外一个线程中启动 Flask 的事件循环。
阅读全文