上传图片的GUI小程序

一、制作桌面程序

  1. 创建一个tkinter 应用,初始化界面(init)、一个选择图片按钮、一个画布(create_widgets)两个Text。
    1. 在 upload 的按钮中绑定 openfile方法。
    2. 设置 cv,text_url,text为全局变量。
  2. 编写openfile 方法
  3. 添加upQiniu 方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class Application(tk.Frame):
cv = None
text_url = None
text = None

def __init__(self, master=None, qiniu = None):
super().__init__(master)
self.master = master
master.geometry('300x400')
self.pack(fill=tk.BOTH, expand=1)
self.create_widgets()
self.qiniu = qiniu

def create_widgets(self):
upload = tk.Button(self, text="选择图片", command=self.openfile)
upload.pack(side="bottom")
global cv, text_url, text
cv = tk.Canvas(self, bg='white', height=300, width=300)
cv.pack(side="top")
text = tk.Text(self, height=2, width=30)
text.insert(tk.END, "图片链接")
text.pack(side="bottom")
text_url = tk.Text(self, height=3, width=30)
text_url.pack(side="bottom")
text_url.insert(tk.END, "图片位置")

def openfile(self):
# 1. 选择图片位置
file = filedialog.askopenfilename(parent=self.master, initialdir="C:/Users/wind0/Desktop", title='Choose an image.')
# 2. 在程序中显示上传文件位置
text.delete('1.0', 'end')
text.insert(tk.END, file)
# 3. 读取图片
img = ImageTk.PhotoImage(Image.open(file))
# 4. 在程序中显示图片
cv.image = img
cv.create_image(0, 0, anchor='nw', image=img)
# 5.调用函数,上传图片,并得到返回值显示
url = self.upQiniu(file)
text_url.delete('1.0', 'end')
text_url.insert(tk.END, url)
print(url)
def upQiniu(self, file):
pass

二、添加上传方法

  1. 安装七牛云的包
1
pip install qiniu
  1. 按照七牛云sdk编写上传代码

    注意这里用的url,是我配置的域名地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 0. 新建七牛云服务
access_key = '********'
secret_key = '********'
q = Auth(access_key, secret_key)
# 1.基本配置:
bucket_name = 'block' # 要上传的空间名称
url = "http://imgs.windranger.wang/" # 返回地址
key = file.split("/")[-1] # 上传文件名
# 2. 建立连接
token = q.upload_token(bucket_name, key, 3600)
ret, info = put_file(token, key, file) # File 为上传文件路径
# 3. 读取返回值
img_url = url + ret['key']
print(img_url)

三、使用 pyinstaller 打包

1
2
3
pip install pyinstaller # 安装包
pyinstaller -F -w main.py # 打包程序
pyinstaller -F -w -c main.py # 如果出现错误,加上-c调试

四、完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
from qiniu import Auth, put_file


class Application(tk.Frame):
cv = None
text_url = None
text = None

def __init__(self, master=None, qiniu = None):
super().__init__(master)
self.master = master
master.geometry('300x400')
self.pack(fill=tk.BOTH, expand=1)
self.create_widgets()
self.qiniu = qiniu

def create_widgets(self):
upload = tk.Button(self, text="选择图片", command=self.openfile)
upload.pack(side="bottom")
global cv, text_url, text
cv = tk.Canvas(self, bg='white', height=300, width=300)
cv.pack(side="top")
text = tk.Text(self, height=2, width=30)
text.insert(tk.END, "图片链接")
text.pack(side="bottom")
text_url = tk.Text(self, height=3, width=30)
text_url.pack(side="bottom")
text_url.insert(tk.END, "图片位置")

def openfile(self):
# 1. 选择图片位置
file = filedialog.askopenfilename(parent=self.master, initialdir="C:/Users/wind0/Desktop", title='Choose an image.')
# 2. 在程序中显示上传文件位置
text.delete('1.0', 'end')
text.insert(tk.END, file)
# 3. 读取图片
img = ImageTk.PhotoImage(Image.open(file))
# 4. 在程序中显示图片
cv.image = img
cv.create_image(0, 0, anchor='nw', image=img)
# 5.调用函数,上传图片,并得到返回值显示
url = self.upQiniu(file)
text_url.delete('1.0', 'end')
text_url.insert(tk.END, url)
print(url)

def upQiniu(self, file):
# 1.基本配置:
bucket_name = 'block' # 要上传的空间
url = "http://imgs.windranger.wang/" # 返回地址
key = file.split("/")[-1] # 上传文件名
# 2. 建立连接
token = q.upload_token(bucket_name, key, 3600)
ret, info = put_file(token, key, file) # File 为上传文件路径
# 3. 读取返回值
img_url = url + ret['key']
return img_url


# 1. 创建一个tk
ws = tk.Tk(className="上传图片")
# 2. 新建七牛云服务
access_key = '*****************'
secret_key = '*****************'
q = Auth(access_key, secret_key)

# 2.传入Application初始化
app = Application(master=ws, qiniu=q)
ws.mainloop()

五、待完善的问题

  1. 异步处理
    • 读取图片
    • 网络请求
  2. 界面太丑

六、展示