python - 如何启动功能,只有在用户选择文件后?
问题描述
我正在尝试创建一个简单的 GUI,在按下上传按钮、选择文件并上传它们后,它将运行另一个功能。问题是,无论我尝试什么,它要么完全阻止 GUI,要么根本不起作用。
我当前的代码看起来像这样
import tkinter as tk
from tkinter import *
from tkinter import messagebox
from tkinter import filedialog
def populate(frame):
# for image in filename():
# image = Image.open(image)
# photo = ImageTk.PhotoImage(image.resize((200, 200), Image.ANTIALIAS))
# label = Label(top_left, image=photo)
# label.image = photo
# label.pack()
for row in range(100):
tk.Label(frame, text="%s" % row, width=3, borderwidth="1",
relief="solid").grid(row=row, column=0)
t="this is the second column for row %s" %row
tk.Label(frame, text=t).grid(row=row, column=1)
def onFrameConfigure(canvas):
'''Reset the scroll region to encompass the inner frame'''
canvas.configure(scrollregion=canvas.bbox("all"))
def uploadAction(event=None):
filename = filedialog.askopenfilenames(parent=root, title='Choose files')
print('Selected:', filename)
return filename
def uploadButton():
UploadButton = Button(root, text='Select image(s)', command=uploadAction)
UploadButton.place(relx = 0.40, rely = 0.9)# 100,y = 260)
#UploadButton.pack()
root = tk.Tk()
root.title('Deasease detector')
root.minsize(600,600)
canvas = tk.Canvas(root, borderwidth=5, background="green")
frame = tk.Frame(canvas, background="blue")
vsb = tk.Scrollbar(root, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)
vsb.pack(side="right", fill="y")
canvas.pack(side="left", fill="both", expand=True)
canvas.create_window((4,4), window=frame, anchor="nw")
frame.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas))
uploadButton()
populate(frame)# ????????????????????????????????????????
root.mainloop()
populate(frame) 是我想在文件提交后调用的函数,但是到目前为止我还没有成功。
我尝试使用 after() 函数和 lambda 通过按钮按下来调用两个函数,但是到目前为止都没有工作。
任何帮助表示赞赏。
解决方案
您可以简单地调用populate()
inside uploadAction()
,但您需要将选定的文件传递给populate()
:
from PIL import Image, ImageTk
...
def populate(frame, filenames):
# do whatever you want on filenames
# below will show all the selected images in the frame
for row, fname in enumerate(filenames):
image = Image.open(fname)
photo = ImageTk.PhotoImage(image.resize((200, 200), Image.ANTIALIAS))
label = tk.Label(frame, image=photo)
label.grid(row=row, column=0)
label.photo = photo
def uploadAction(event=None):
filenames = filedialog.askopenfilenames(parent=root, title='Choose files')
print('Selected:', filenames)
if filenames:
populate(frame, filenames) # call populate() on filenames
return filenames
推荐阅读
- android - 智能眼镜 Vuzix M300 上的 Android 语音识别
- python - RuntimeError:成本函数在其第 1 个输出中返回 nan 值
- angular - 登录后网址不正确
- flutter - 如何实现一个使用flutter_secure_storage包读写数据的流程【带Provider包】
- hive - 我们如何在 Hive 中为星型模式进行分桶
- ios - Alamofire 证书固定不起作用
- c++ - GCC 4.4.7 与 GCC 4.9.2 中的向量
- c# - 使用 Xamarin Forms 以编程方式打开 APK - Android 8.1
- .net - 用户身份验证前的初始 API 令牌 - .NET 核心 Web API
- vba - MS Access - 使用 VBA 自动为“访问无法附加所有数据”错误消息选择是