Python實現GUI圖片瀏覽程序

Python實現GUI圖片瀏覽程序

下面程序需要pillow庫。pillow是 Python 的第三方圖像處理庫,需要安裝才能實用。pillow是PIL( Python Imaging Library)基礎上發展起來的,需要注意的是pillow庫安裝用pip install pillow,導包時要用PIL來導入。更多情況可見https://blog.csdn.net/cnds123/article/details/126141838

一、簡單的圖片查看程序

功能,使用了tkinter庫來創建一個窗口,用戶可以通過該窗口選擇一張圖片并在窗口中顯示。能調整窗口大小以適應圖片。效果圖如下:

源碼如下:

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk# 創建一個Tkinter窗口
root = tk.Tk()
root.geometry("400x300")  # 設置寬度為400像素,高度為300像素
root.title("Image Viewer")# 添加一個按鈕來選擇圖片
def open_image():try:file_path = filedialog.askopenfilename()if file_path:image = Image.open(file_path)photo = ImageTk.PhotoImage(image)# 清除舊圖片for widget in root.winfo_children():if isinstance(widget, tk.Label):widget.destroy()label = tk.Label(root, image=photo)label.image = photolabel.pack()# 調整窗口大小以適應圖片root.geometry("{}x{}".format(image.width, image.height))except AttributeError:print("No image selected.")button = tk.Button(root, text="Open Image", command=open_image)
button.pack()# 運行窗口
root.mainloop()

此程序,創建一個tkinter窗口,設置窗口的大小為400x300像素,并設置窗口標題為"Image Viewer"。

添加一個按鈕,當用戶點擊該按鈕時,會彈出文件選擇對話框,用戶可以選擇一張圖片文件。

選擇圖片后,程序會使用PIL庫中的Image.open方法打開所選的圖片文件,并將其顯示在窗口中。

程序會在窗口中顯示所選的圖片,并在用戶選擇新圖片時清除舊圖片。

示例中,使用try-except塊來捕獲FileNotFoundError,該錯誤會在用戶取消選擇圖片時觸發。當用戶取消選擇圖片時,會打印一條消息提示用戶沒有選擇圖片。這樣就可以避免因為取消選擇圖片而導致的報錯。

二、圖片查看程序1

“Open Directory”按鈕用于指定一個目錄,窗體上再添加兩個按鈕:“Previous Image” 和“Next Image”,單擊這兩個按鈕實現切換顯示指定目錄中的圖片。這三個按鈕水平排列在頂部,在下方顯示圖片。如果所選圖片的尺寸超過了窗口的大小,程序會將圖片縮放到合適的尺寸以適應窗口。效果圖如下:

源碼如下:

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import osclass ImageViewer:def __init__(self, root):self.root = rootself.root.geometry("400x350")self.root.title("Image Viewer")self.image_dir = ""self.image_files = []self.current_index = 0# 創建頂部按鈕框架self.button_frame = tk.Frame(self.root)self.button_frame.pack(side="top")# 創建打開目錄按鈕self.open_button = tk.Button(self.button_frame, text="Open Directory", command=self.open_directory)self.open_button.pack(side="left")# 創建上一張圖片按鈕self.prev_button = tk.Button(self.button_frame, text="Previous Image", command=self.show_previous_image)self.prev_button.pack(side="left")# 創建下一張圖片按鈕self.next_button = tk.Button(self.button_frame, text="Next Image", command=self.show_next_image)self.next_button.pack(side="left")# 創建圖片顯示區域self.image_label = tk.Label(self.root)self.image_label.pack()def open_directory(self):try:self.image_dir = filedialog.askdirectory()if self.image_dir:self.image_files = [f for f in os.listdir(self.image_dir) if f.endswith(".jpg") or f.endswith(".png") or f.endswith(".jfif")]self.current_index = 0self.show_image()except tk.TclError:print("No directory selected.")def show_image(self):if self.image_files:image_path = os.path.join(self.image_dir, self.image_files[self.current_index])image = Image.open(image_path)image.thumbnail((400, 300), Image.ANTIALIAS)photo = ImageTk.PhotoImage(image)self.image_label.config(image=photo)self.image_label.image = photodef show_previous_image(self):if self.image_dir:if self.image_files:self.current_index = (self.current_index - 1) % len(self.image_files)self.show_image()else:print("Please open a directory first.")else:print("Please open a directory first.")def show_next_image(self):if self.image_dir:if self.image_files:self.current_index = (self.current_index + 1) % len(self.image_files)self.show_image()else:print("Please open a directory first.")else:print("Please open a directory first.")root = tk.Tk()
app = ImageViewer(root)
root.mainloop()

三、圖片查看程序2

窗體上有3個控件,列表框和按鈕和在窗體上左側上下放置,右側區域顯示圖片, “Open Directory”按鈕用于指定目錄中,列表用于放置指定目錄中的所有圖片文件名,點擊列表中的圖片文件名,圖片在右側不變形縮放顯示到窗體上(圖片縮放到合適的尺寸以適應窗口),效果圖如下:

源碼如下:

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import os# 創建主窗口
root = tk.Tk()
root.geometry("600x300")
root.title("Image Viewer")# 創建一個Frame來包含按鈕和列表框
left_frame = tk.Frame(root)
left_frame.pack(side=tk.LEFT, fill=tk.BOTH, padx=5, pady=5)# 創建一個Frame來包含圖片顯示區域
right_frame = tk.Frame(root)
right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)# 創建一個列表框來顯示文件名
listbox = tk.Listbox(left_frame)
listbox.pack(fill=tk.BOTH, expand=True)# 創建一個滾動條并將其與列表框關聯
scrollbar = tk.Scrollbar(root, orient=tk.VERTICAL)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
scrollbar.config(command=listbox.yview)
listbox.config(yscrollcommand=scrollbar.set)# 創建一個標簽來顯示圖片
image_label = tk.Label(right_frame)
image_label.pack(fill=tk.BOTH, expand=True)# 函數:打開目錄并列出圖片文件
def open_directory():directory = filedialog.askdirectory()if directory:# 清空列表框listbox.delete(0, tk.END)# 列出目錄中的所有圖片文件for file in os.listdir(directory):if file.lower().endswith(('.jpg', '.jpeg', '.png', '.gif','.jfif')):listbox.insert(tk.END, file)# 保存當前目錄open_directory.current_directory = directory# 函數:在右側顯示選中的圖片
def show_selected_image(event):if not hasattr(open_directory, 'current_directory'):return# 獲取選中的文件名selected_file = listbox.get(listbox.curselection())# 構建完整的文件路徑file_path = os.path.join(open_directory.current_directory, selected_file)# 打開圖片并進行縮放image = Image.open(file_path)image.thumbnail((right_frame.winfo_width(), right_frame.winfo_height()), Image.ANTIALIAS)# 用PIL的PhotoImage顯示圖片photo = ImageTk.PhotoImage(image)image_label.config(image=photo)image_label.image = photo  # 保存引用,防止被垃圾回收# 創建“Open Directory”按鈕
open_button = tk.Button(left_frame, text="Open Directory", command=open_directory)
open_button.pack(fill=tk.X)# 綁定列表框選擇事件
listbox.bind('<<ListboxSelect>>', show_selected_image)# 運行主循環
root.mainloop()

OK!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209833.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209833.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209833.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【改進YOLOv8】融合可擴張殘差(DWR)注意力模塊的小麥病害檢測系統

1.研究背景與意義 項目參考AAAI Association for the Advancement of Artificial Intelligence 研究背景與意義&#xff1a; 隨著計算機視覺技術的快速發展&#xff0c;深度學習在圖像識別和目標檢測領域取得了巨大的突破。其中&#xff0c;YOLO&#xff08;You Only Look O…

基于SSM框架的網上商城系統的設計與實現

完整下載&#xff1a;基于SSM框架的網上商城系統的設計與實現 基于SSM框架的網上商城系統的設計與實現 "Design and Implementation of an Online Shopping Mall System Based on SSM Framework" 目錄 目錄 2 摘要 3 關鍵詞 3 第一章 系統設計 4 1.1 系統需求分析 4 …

TruLens RAG Triad 學習

TruLens RAG Triad 學習 0. 背景1. RAG 三元組2. TruLens 快速入門2-1. 安裝依賴2-2. 初始化 OpenAI 認證信息2-3. 獲取數據2-4. 創建向量存儲2-5. 從頭構建自定義 RAG2-6. 設置反饋函數2-7. 構建應用程序2-8. 運行應用程序0. 背景 近年來,RAG 架構已成為為大型語言模型 (LLM…

Nexus搭建npm私庫(角色管理、上傳腳本)

安裝Nexus 官網下載 https://www.sonatype.com/products/sonatype-nexus-oss-download 進入官網下載&#xff0c;最新下載方式需要輸入個人信息才能下載了 選擇對應的系統進行下載 Windows 推薦也下載 UNIX 版本&#xff08;Windows 版本配置比較難改&#xff09; 如果沒有下…

chmod 在Linux原生應用開發過程中的簡單應用

chmod命令實質上是用來修改文件或目錄的訪問權限的命令。它通過修改文件或目錄的訪問控制列表&#xff08;Access Control List&#xff0c;ACL&#xff09;來實現權限的更改。 在Linux系統中&#xff0c;每個文件或目錄都有一個表示其權限的數字值&#xff0c;即用三個八進制…

Qt 中的窗口類

目錄 QWidget 設置父對象 窗口位置 測試代碼 窗口尺寸 窗口標題和圖標 信號 槽函數 QDialog 常用API QDialog的子類 QMessageBox QFileDialog QFontDialog QFontDialog類的靜態API QColorDialog 顏色類 QColor 靜態API函數 測試代碼 QInputDialog 靜態函數…

谷歌AI新篇章:Gemini引領股價飆升,挑戰OpenAI霸主地位

導語&#xff1a; “ 在人工智能領域的一場激烈角逐中&#xff0c;谷歌母公司Alphabet以其全新AI大模型Gemini&#xff0c;于周四收盤時引爆股市&#xff0c;股價激增5.3%&#xff0c;市值一日增長超800億美元。這一躍升不僅展示了谷歌在技術創新上的決心&#xff0c;也是對微軟…

GPT4停止訂閱付費了怎么辦? 怎么升級ChatGPT plus?提供解決方案

11月中旬日OpenAI 暫時關閉所有的升級入口之后&#xff0c;很多小伙伴就真的在排隊等待哦。其實有方法可以繞開排隊&#xff0c;直接付費訂閱升級GPT的。趕緊用起來立馬“插隊”成功&#xff01;親測~~~ 一、登錄ChatGPT賬號 1、沒有賬號可以直接注冊一個&#xff0c;流程超級…

前端使用視頻作為背景圖的方法

實現思路 通過 video source 引入視頻&#xff0c;并對視頻播放屬性進行設置&#xff0c;再通過 css 使視頻覆蓋背景即可。 代碼 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>有開發問題可聯系作者</title>…

學習git后,真正在項目中如何使用?

文章目錄 前言下載和安裝Git克隆遠程倉庫PyCharm鏈接本地Git創建分支修改項目工程并提交到本地倉庫推送到遠程倉庫小結 前言 網上學習git的教程&#xff0c;甚至還有很多可視化很好的git教程&#xff0c;入門git也不是什么難事。但我發現&#xff0c;當我真的要從網上克隆一個…

ubuntu18.04安裝pcl1.11.1

一、安裝pcl1.11.1依賴 sudo apt-get update sudo apt-get install git build-essential linux-libc-dev sudo apt-get install cmake cmake-gui sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev sudo apt-get install mpi-default-dev openmpi-bin openmpi-…

SQL事務的開啟,提交和回滾

在處理數據庫數據的時候會出現一種情況就是我們刪除兩個關聯的表其中一個表的信息&#xff0c;另一個表也需要改動&#xff0c;但是我們SQL語句在同時更改兩個表的同時&#xff0c;難免會出現一個表修改成功&#xff0c;另一個出現錯誤&#xff0c;這時候表與表之間就會出現矛盾…

webrtc網之sip轉webrtc

OpenSIP是一個開源的SIP&#xff08;Session Initiation Protocol&#xff09;服務器&#xff0c;它提供了一個可擴展的基礎架構&#xff0c;用于建立、終止和管理VoIP&#xff08;Voice over IP&#xff09;通信會話。SIP是一種通信協議&#xff0c;用于建立、修改和終止多媒體…

geolife 筆記:將所有軌跡放入一個DataFrame

單條軌跡的處理&#xff1a;geolife筆記&#xff1a;整理處理單條軌跡-CSDN博客 1 加載數據 import pandas as pd import numpy as np import datetime as dt import osdata_dir Geolife Trajectories 1.3/Data/ 1.1 列出所有文件夾 dirlist os.listdir(data_dir) dirlist…

Esxi登錄超時:“由于不活動超時,您已被注銷“,修改UserVars.HostClientSessionTimeout為0永不超時

Esxi登錄超時:“由于不活動超時&#xff0c;您已被注銷”,修改UserVars.HostClientSessionTimeout為0永不超時 UserVars.HostClientSessionTimeout0永不超時 Esxi網頁登錄后,一段時間不操作就會被注銷 提示: 由于不活動超時&#xff0c;您已被注銷 主機→管理→系統→高級設…

【linux】查看CPU和內存信息

之前咱們一起學習了查看內存的和CPU的命令。 ?mpstat &#xff1a; 【linux】 mpstat 使用 uptime&#xff1a;【Linux】 uptime命令使用 CPU的使用率&#xff1a;【linux】查看CPU的使用率 nmon &#xff1a;【linux】nmon 工具使用 htop &#xff1a;【linux】htop 命令…

文件格式對齊、自定義快捷鍵、idea

文件格式對齊 Shift Alt F 自動格式化代碼的快捷鍵&#xff08;如何配置自動格式化&#xff09; 日常編碼必備idea快捷鍵 [VS Code] 入門-自定鍵盤快捷鍵 文件格式對齊 文件格式對齊通常是通過編輯器或IDE提供的快捷鍵或命令完成的。以下是一些常見編輯器和IDE中進行文件…

四、C#筆記

/// <summary> /// 第七章&#xff1a;創建并管理類和對象 /// </summary> namespace Chapter7 { class Program { public static int Num 0;//7.6.1創建共享字段 public const double PI 3.1415926;//7.6.2使用const關鍵字創建靜態字段…

快速認識什么是:Docker

Docker&#xff0c;一種可以將軟件打包到容器中并在任何環境中可靠運行的工具。但什么是容器以及為什么需要容器呢&#xff1f;今天就來一起學快速入門一下Docker吧&#xff01;希望本文對您有所幫助。 假設您使用 Cobol 構建了一個在某種奇怪風格的 Linux 上運行的應用程序。您…

Linux C語言 41-進程間通信IPC之共享內存

Linux C語言 41-進程間通信IPC之共享內存 本節關鍵字&#xff1a;C語言 進程間通信 共享內存 shared memory 相關庫函數&#xff1a;shmget、shmat、shmdt、shmctl 什么是共享內存&#xff1f; 共享內存&#xff08;Shared Memory&#xff09;指兩個或多個進程共享一個給定的…