|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
主要问题:
1.在画布上导入的图片无法全覆盖画布
2.图片不随画布的缩放而缩放或者随窗口的缩放而缩放
PS:另外希望有大佬跟我讲解一下具体什么时候才使用全局变量
本人Python新手一枚,在网上查阅相关资料后无果,特发此贴请求各路大佬的指点
在此鸣谢提供代码的@qq1151985918 大佬,基于此代码我稍作改动,代码贴在下方,希望能基于此代码提供相关修改代码
from os import listdir
from tkinter import *
from tkinter import filedialog
from PIL import Image,ImageTk
files = {}
img_open = None
img = None
help_text="""
1.打开文件
2.选择打开文件或文件夹
3.单击显示图片
"""
root = Tk()
root.title("树叶计数")
root.geometry("600x600")
#-------------------命令----------------------#
def open_file():
file_paths = filedialog.askopenfilenames()
list1.delete(0,END)
files.clear()
file_list = []
for file_path in file_paths:
name = file_path.split("/")[-1]
file_list.append(name)
files[name] = file_path
list1.insert(END,name)
def open_dir():
dir_path = filedialog.askdirectory()
list1.delete(0,END)
files.clear()
file_names = []
target_file_name = ["jpg","png","gif"]
for name in listdir(dir_path):
if name.split(".")[-1].lower() in target_file_name:
file_names.append(name)
files[name] = dir_path+"/"+name
list1.insert(END,name)
def show_view(event):
global img_open
global img
get_file = list1.get(ACTIVE)
file_path = files[get_file]
img_open = Image.open(file_path)
img_open.thumbnail((400,600),Image.ANTIALIAS)
img = ImageTk.PhotoImage(img_open)
back.create_image(200,300,anchor=CENTER,image=img)
#-------------------菜单栏--------------------#
menubar = Menu(root)
file_menu = Menu(menubar,tearoff=0)
file_menu.add_command(label="打开文件",command=open_file)
file_menu.add_command(label="打开文件夹",command=open_dir)
file_menu.add_separator()
file_menu.add_command(label="退出",command=root.quit)
menubar.add_cascade(label="文件",menu=file_menu)
train_menu = Menu(menubar,tearoff=0)
menubar.add_cascade(label="训练",menu=train_menu)
test_menu = Menu(menubar,tearoff=0)
menubar.add_cascade(label="测试",menu=test_menu)
detect_menu = Menu(menubar,tearoff=0)
menubar.add_cascade(label="检测",menu=detect_menu)
root.config(menu=menubar)
#------------------画布-----------------------#
back = Canvas(root,width=400,height=600,bg="white")
back.pack(side=RIGHT,fill=BOTH,expand=True)
back.create_text(200,300,anchor=CENTER,text=help_text)
#------------------滚动条---------------------#
sb = Scrollbar(root)
sb.pack(side=RIGHT,anchor=CENTER,fill=Y)
#-------------------列表框--------------------#
list1 = Listbox(root,yscrollcommand=sb.set)
list1.pack(side=LEFT,fill=Y)
list1.bind("<Button-1>",show_view)
sb.config(command=list1.yview())
root.mainloop()
from os import listdir
from tkinter import *
from tkinter import filedialog
from PIL import Image,ImageTk
files = {}
img_open = None
img = None
help_text="""
1.打开文件
2.选择打开文件或文件夹
3.单击显示图片
"""
root = Tk()
root.title("树叶计数")
root.geometry("600x600")
# -------------------命令----------------------#
def open_file():
file_paths = filedialog.askopenfilenames()
list1.delete(0,END)
files.clear()
file_list = []
for file_path in file_paths:
name = file_path.split("/")[-1]
file_list.append(name)
files[name] = file_path
list1.insert(END,name)
def open_dir():
dir_path = filedialog.askdirectory()
list1.delete(0,END)
files.clear()
file_names = []
target_file_name = ["jpg","png","gif"]
for name in listdir(dir_path):
if name.split(".")[-1].lower() in target_file_name:
file_names.append(name)
files[name] = dir_path+"/"+name
list1.insert(END,name)
def show_view(event):
global img_open
global img
try:
back.delete("all") # 清空原画布所有内容
get_file = list1.get(ACTIVE)
file_path = files[get_file]
except:
return
back_width = back.winfo_width() # 获取当前画布宽度
back_height = back.winfo_height() # 获取当前画布高度
img_open = Image.open(file_path)
img_open.thumbnail((back_width,back_height),Image.ANTIALIAS) # 以当前画布尺寸适应大小
img = ImageTk.PhotoImage(img_open)
back.create_image(back_width/2,back_height/2,anchor=CENTER,image=img) # 重新定义画布中心
def refresh(event):
root_width = root.winfo_width() # 获取当前窗口尺寸
root_height = root.winfo_height()
back.config(width=root_width-200, height=root_height-10) # 重新设置画布尺寸
show_view(1) # 重新显示当前图片 参数 1 必须但不唯一,可以是任何内容
# 这里的参数 event 有必要解释一下,event 是事件,
# 一般来说是tkinter当前控件的某种属性
# 当使用bind方法绑定一个方法时必须指定的一个参数,但不一定要用到
# 等你用多了就了解了
# -------------------菜单栏--------------------#
menubar = Menu(root)
file_menu = Menu(menubar,tearoff=0)
file_menu.add_command(label="打开文件",command=open_file)
file_menu.add_command(label="打开文件夹",command=open_dir)
file_menu.add_separator()
file_menu.add_command(label="退出",command=root.quit)
menubar.add_cascade(label="文件",menu=file_menu)
train_menu = Menu(menubar,tearoff=0)
menubar.add_cascade(label="训练",menu=train_menu)
test_menu = Menu(menubar,tearoff=0)
menubar.add_cascade(label="测试",menu=test_menu)
detect_menu = Menu(menubar,tearoff=0)
menubar.add_cascade(label="检测",menu=detect_menu)
root.config(menu=menubar)
# ------------------画布-----------------------#
back = Canvas(root,width=400,height=600,bg="white")
back.pack(side=RIGHT,fill=BOTH,expand=True)
back.create_text(200,300,anchor=CENTER,text=help_text)
# ------------------滚动条---------------------#
sb = Scrollbar(root)
sb.pack(side=RIGHT,anchor=CENTER,fill=Y)
# -------------------列表框--------------------#
list1 = Listbox(root,yscrollcommand=sb.set)
list1.pack(side=LEFT,fill=Y)
list1.bind("<Button-1>",show_view)
sb.config(command=list1.yview())
root.bind("<Configure>",refresh) # 绑定refersh函数为窗口属性变化事件
root.mainloop()
看代码不能只知其一不知其二,联系上下来看就容易理解得多
你回复中的代码太乱了我没用
用的是你帖子中的代码
对照一下吧,我给你加了注释
|
|