|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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()
复制代码
看代码不能只知其一不知其二,联系上下来看就容易理解得多
你回复中的代码太乱了我没用
用的是你帖子中的代码
对照一下吧,我给你加了注释
|
|