鱼C论坛

 找回密码
 立即注册
查看: 1332|回复: 10

[已解决]如何使用Tkinter创建一个载入图片的窗口

[复制链接]
发表于 2021-8-28 12:09:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 黎明丿晓小 于 2021-8-28 12:11 编辑

主要问题:
1.“文件”选项卡中的点击“打开文件”后如何导入电脑中选中的图片,以及点击“打开文件夹”导入电脑中的一整个文件夹的图片
2.如何实现点击“打开”和“打开文件夹”选项卡后弹出整个电脑的弹窗

Tips:
1.训练、测试、检测三个选项卡的功能暂且不做
2.左边框用到Listbox列表框组件;右边黄色为Canvas画布组件,使得图片能够在画布上显示
3.选中左边列表框中的目标,右边画布能够显示对应的图片
4.最后能够给列表框加一个滚动条,上下滑动显示所有导入的目标



新人小白一枚,希望能够有大佬给出完整的代码,或者是针对那两个主要问题的代码,小人在此谢过了~
最佳答案
2021-8-28 16:41:47
本帖最后由 qq1151985918 于 2021-8-28 21:38 编辑

刚闲下来重新敲了一个,感觉比我以前自己写的那个简单了点,凑合吧
  1. from tkinter import filedialog
  2. from tkinter import *
  3. from os import listdir
  4. from PIL import Image, ImageTk


  5. files = {}
  6. img_open = None
  7. img = None
  8. help_text = """
  9. 1.打开文件下拉菜单
  10. 2.选择打开文件方式
  11. 3.双击列表显示图片
  12. """


  13. def open_file():
  14.     file_path = filedialog.askopenfilename()
  15.     file_list.delete(0, "end")
  16.     files.clear()

  17.     name = file_path.split("/")[-1]
  18.     files[name] = file_path
  19.     file_list.insert("end", name)


  20. def open_dir():
  21.     dir_path = filedialog.askdirectory()
  22.     file_list.delete(0, "end")
  23.     files.clear()

  24.     target_file_name = ["jpg", "png", "gif"]
  25.     for name in listdir(dir_path):
  26.         if name.split(".")[-1].lower() in target_file_name:
  27.             files[name] = dir_path + "/" + name
  28.             file_list.insert("end", name)


  29. def show_view(event):
  30.     global img_open
  31.     global img
  32.     get_file = file_list.get(ACTIVE)
  33.     file_path = files[get_file]
  34.     img_open = Image.open(file_path)
  35.     img_open.thumbnail((265, 390), Image.ANTIALIAS)
  36.     img = ImageTk.PhotoImage(img_open)
  37.     canvas.create_image(133, 195, anchor=CENTER, image=img)
  38.    

  39. root = Tk()
  40. root.geometry("500x400")
  41. root.resizable(0, 0)
  42. root.title("标题")

  43. menubar = Menu(root, tearoff=0)

  44. file_menu = Menu(menubar, tearoff=0)
  45. file_menu.add_command(label="打开", command=open_file)
  46. file_menu.add_command(label="打开文件夹", command=open_dir)
  47. file_menu.add_separator()
  48. file_menu.add_command(label="退出", command=exit)

  49. train_menu = Menu(menubar, tearoff=0)
  50. test_menu = Menu(menubar, tearoff=0)
  51. detect_menu = Menu(menubar, tearoff=0)

  52. menubar.add_cascade(label="文件", menu=file_menu)
  53. menubar.add_cascade(label="训练", menu=train_menu)
  54. menubar.add_cascade(label="测试", menu=test_menu)
  55. menubar.add_cascade(label="检测", menu=detect_menu)

  56. root.config(menu=menubar)


  57. sb = Scrollbar(root)
  58. sb.place(x=205, y=5, width=15, height=390)
  59. file_list = Listbox(root, yscrollcommand=sb.set)
  60. file_list.place(x=5, y=5, width=200, height=390)
  61. file_list.bind("<Double-Button-1>", show_view)
  62. sb.config(command=file_list.yview)


  63. canvas = Canvas(root, bg="white", width=265, height=390)
  64. canvas.place(x=225, y=5)
  65. canvas.create_text(133, 195, anchor=CENTER, text=help_text)

  66. root.mainloop()
复制代码

整个电脑弹窗

整个电脑弹窗

窗口界面

窗口界面
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-28 12:51:11 | 显示全部楼层
我以前写过一个,跟你说的一模一样,找不到了,应该在我另一台电脑,等我一会儿给你再敲一个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-28 13:10:00 | 显示全部楼层
qq1151985918 发表于 2021-8-28 12:51
我以前写过一个,跟你说的一模一样,找不到了,应该在我另一台电脑,等我一会儿给你再敲一个

十分感谢,这是导师布置的任务,这个布局是我自己臆想的,没想到有一模一样的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-28 16:01:39 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-28 16:33:59 | 显示全部楼层
叼辣条闯世界 发表于 2021-8-28 16:01
https://www.pynote.net/archives/

不好意思哈,进入页面404报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-28 16:41:47 | 显示全部楼层    本楼为最佳答案   
本帖最后由 qq1151985918 于 2021-8-28 21:38 编辑

刚闲下来重新敲了一个,感觉比我以前自己写的那个简单了点,凑合吧
  1. from tkinter import filedialog
  2. from tkinter import *
  3. from os import listdir
  4. from PIL import Image, ImageTk


  5. files = {}
  6. img_open = None
  7. img = None
  8. help_text = """
  9. 1.打开文件下拉菜单
  10. 2.选择打开文件方式
  11. 3.双击列表显示图片
  12. """


  13. def open_file():
  14.     file_path = filedialog.askopenfilename()
  15.     file_list.delete(0, "end")
  16.     files.clear()

  17.     name = file_path.split("/")[-1]
  18.     files[name] = file_path
  19.     file_list.insert("end", name)


  20. def open_dir():
  21.     dir_path = filedialog.askdirectory()
  22.     file_list.delete(0, "end")
  23.     files.clear()

  24.     target_file_name = ["jpg", "png", "gif"]
  25.     for name in listdir(dir_path):
  26.         if name.split(".")[-1].lower() in target_file_name:
  27.             files[name] = dir_path + "/" + name
  28.             file_list.insert("end", name)


  29. def show_view(event):
  30.     global img_open
  31.     global img
  32.     get_file = file_list.get(ACTIVE)
  33.     file_path = files[get_file]
  34.     img_open = Image.open(file_path)
  35.     img_open.thumbnail((265, 390), Image.ANTIALIAS)
  36.     img = ImageTk.PhotoImage(img_open)
  37.     canvas.create_image(133, 195, anchor=CENTER, image=img)
  38.    

  39. root = Tk()
  40. root.geometry("500x400")
  41. root.resizable(0, 0)
  42. root.title("标题")

  43. menubar = Menu(root, tearoff=0)

  44. file_menu = Menu(menubar, tearoff=0)
  45. file_menu.add_command(label="打开", command=open_file)
  46. file_menu.add_command(label="打开文件夹", command=open_dir)
  47. file_menu.add_separator()
  48. file_menu.add_command(label="退出", command=exit)

  49. train_menu = Menu(menubar, tearoff=0)
  50. test_menu = Menu(menubar, tearoff=0)
  51. detect_menu = Menu(menubar, tearoff=0)

  52. menubar.add_cascade(label="文件", menu=file_menu)
  53. menubar.add_cascade(label="训练", menu=train_menu)
  54. menubar.add_cascade(label="测试", menu=test_menu)
  55. menubar.add_cascade(label="检测", menu=detect_menu)

  56. root.config(menu=menubar)


  57. sb = Scrollbar(root)
  58. sb.place(x=205, y=5, width=15, height=390)
  59. file_list = Listbox(root, yscrollcommand=sb.set)
  60. file_list.place(x=5, y=5, width=200, height=390)
  61. file_list.bind("<Double-Button-1>", show_view)
  62. sb.config(command=file_list.yview)


  63. canvas = Canvas(root, bg="white", width=265, height=390)
  64. canvas.place(x=225, y=5)
  65. canvas.create_text(133, 195, anchor=CENTER, text=help_text)

  66. root.mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-28 20:10:52 | 显示全部楼层
qq1151985918 发表于 2021-8-28 16:41
刚闲下来重新敲了一个,感觉比我以前自己写的那个简单了点,凑合吧

十分感谢!基本功能都已经实现,你的代码我会好好研究一番,有问题再来请教~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-29 09:33:58 | 显示全部楼层
qq1151985918 发表于 2021-8-28 16:41
刚闲下来重新敲了一个,感觉比我以前自己写的那个简单了点,凑合吧

你好,请问一下,怎么使得列表框、滚动条以及画布和画布中的图片随着窗口的变化而变化
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-30 10:16:04 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-31 16:15:21 | 显示全部楼层
qq1151985918 发表于 2021-8-28 16:41
刚闲下来重新敲了一个,感觉比我以前自己写的那个简单了点,凑合吧

你好,有没有什么方法可以使得导入的图片始终与画布保持一致,并且随着窗口的变化,图片的尺寸也发生相应的改变
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-31 16:52:56 | 显示全部楼层
黎明丿晓小 发表于 2021-8-31 16:15
你好,有没有什么方法可以使得导入的图片始终与画布保持一致,并且随着窗口的变化,图片的尺寸也发生相应 ...

你刚不是回复了我那个帖子么,就在那里看看吧,那个代码就可以
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-19 09:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表