赞
踩
下面是一个示例代码,实现了在Tkinter中显示左右两张图像,并添加了上一张和下一张按钮:
import tkinter as tk from PIL import Image, ImageTk class ImageApp: def __init__(self, master): self.master = master self.images = [] self.current_image = None self.index = 0 # 创建左右两个画布 self.canvas_left = tk.Canvas(master, width=400, height=400) self.canvas_right = tk.Canvas(master, width=400, height=400) self.canvas_left.pack(side=tk.LEFT, padx=10, pady=10) self.canvas_right.pack(side=tk.RIGHT, padx=10, pady=10) # 创建上一张和下一张按钮 self.button_prev = tk.Button(master, text='上一张', command=self.prev_image) self.button_next = tk.Button(master, text='下一张', command=self.next_image) self.button_prev.pack(side=tk.LEFT, padx=10, pady=10) self.button_next.pack(side=tk.RIGHT, padx=10, pady=10) # 加载图像 self.load_images() self.show_current_image() def load_images(self): # 加载图像文件并添加到列表中 self.images.append(Image.open('image1.jpg')) self.images.append(Image.open('image2.jpg')) self.images.append(Image.open('image3.jpg')) def show_current_image(self): # 在画布上显示当前图像 if self.current_image is not None: self.canvas_left.delete(tk.ALL) self.canvas_right.delete(tk.ALL) self.current_image = ImageTk.PhotoImage(self.images[self.index]) self.canvas_left.create_image(0, 0, anchor=tk.NW, image=self.current_image) if self.index + 1 < len(self.images): next_image = ImageTk.PhotoImage(self.images[self.index+1]) self.canvas_right.create_image(0, 0, anchor=tk.NW, image=next_image) def prev_image(self): # 显示上一张图像 if self.index > 0: self.index -= 1 self.show_current_image() def next_image(self): # 显示下一张图像 if self.index + 1 < len(self.images): self.index += 1 self.show_current_image() root = tk.Tk() app = ImageApp(root) root.mainloop()
下面是一个简单的示例代码,演示如何使用PyQt5显示两个图像,并添加上一张和下一张按钮:
import sys from PyQt5.QtGui import QPixmap from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QHBoxLayout, QPushButton, QFileDialog class ImageViewer(QWidget): def __init__(self): super().__init__() self.setWindowTitle("ToolVierer") self.setGeometry(300, 150, 1000, 800) # 创建左右两个 QLabel 和按钮 self.left_label = QLabel() self.right_label = QLabel() self.prev_button = QPushButton('上一张') self.next_button = QPushButton('下一张') self.load_button = QPushButton('Load images') # 绑定按钮点击事件 self.prev_button.clicked.connect(self.show_prev_image) self.next_button.clicked.connect(self.show_next_image) self.load_button.clicked.connect(self.load_images) self.label_list = [] self.image_list = [] if not self.label_list: self.left_label = QLabel("No Images Found") self.right_label = QLabel("No Images Found") else: self.index = 0 self.show_images() # 创建水平布局,放置左右两个 QLabel image_layout = QHBoxLayout() image_layout.addWidget(self.left_label) image_layout.addWidget(self.right_label) hbox_text = QHBoxLayout() self.text_edit = QTextEdit() self.text_edit.setReadOnly(True) hbox_text.addWidget(self.text_edit) hbox_bottom = QHBoxLayout() hbox_bottom.addWidget(self.prev_button) hbox_bottom.addWidget(self.next_button) hbox_bottom.addWidget(self.load_button) # 创建垂直布局,放置图像和按钮 main_layout = QVBoxLayout() main_layout.addLayout(image_layout) main_layout.addLayout(hbox_text) main_layout.addLayout(hbox_bottom) self.setLayout(main_layout) def load_images(self): file_path = QFileDialog.getExistingDirectory(self, "选择文件夹路径") if file_path: for root, dirs, files in os.walk(file_path): for file in files: if file.endswith("png"): label_file = os.path.jon(root, file) self.label_list.append(label_file) image_path = os.path.join(os.path.dirname(root), 'image') image_file = os.path.join(image_path, file.split('.')[0]+'.jpg') self.image_list.append(image_file) self.file_num = len(self.label_list) self.index = 0 self.text_edit.append('[{}/{}]:'.format(self.index+1, self.file_num) + self.label_list[self.index]) self.show_image() def show_image(self): # 加载当前图像,并显示在左右两个 QLabel 中 left_image = QPixmap(self.image_list[self.index]).scaledToHeight(400) right_image = QPixmap(self.label_list[self.index]).scaledToHeight(400) self.left_label.setPixmap(left_image) self.right_label.setPixmap(right_image) def show_prev_image(self): # 显示上一张图像 if self.index > 0: self.index -= 1 self.text_edit.append('[{}/{}]:'.format(self.index+1, self.file_num) + self.label_list[self.index]) self.show_image() def show_next_image(self): # 显示下一张图像 if self.index < len(self.label_list) - 1: self.index += 1 self.text_edit.append('[{}/{}]:'.format(self.index+1, self.file_num) + self.label_list[self.index]) self.show_image() if __name__ == '__main__': app = QApplication(sys.argv) viewer = ImageViewer() viewer.show() sys.exit(app.exec_())
在这个程序中,我们创建了一个 ImageViewer
类,继承自 QWidget
。该类包含了两个 QLabel
和两个 QPushButton
,以及一些与图像加载和显示相关的方法。
在 __init__
方法中,我们初始化了图像列表和当前图像索引,并创建了左右两个 QLabel
和按钮,并为按钮的点击事件绑定了相应的方法。接着,我们创建了一个水平布局,将左右两个 QLabel
放置在该布局中。然后,我们创建了一个垂直布局,将水平布局和两个按钮放置在该布局中。最后,我们将垂直布局设置为该窗口的主布局。
在 show_image
方法中,我们加载当前图像和下一张图像,并将它们显示在左右两个 QLabel
中。我们使用 QPixmap
类加载图像,并使用 scaledToHeight
方法将图像缩放到指定高度,以避免图像太大而导致显示异常。
在 show_prev_image
和 show_next_image
方法中,我们分别将当前图像索引减一和加一,然后调用 show_image
方法显示新的图像。我们还添加了一些边界检查,确保不会越界。
最后,我们创建了一个 QApplication
实例,创建了一个 ImageViewer
实例,并将它显示出来。我们调用 sys.exit
方法确保程序在关闭窗口时能够正常退出。
以下是一个简单的实现代码,将文件夹中的图片轮流在左右两个窗口内显示,并且添加了上一张和下一张按钮:
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QHBoxLayout, QLabel, QPushButton from PyQt5.QtGui import QPixmap import os class ImageViewer(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle('Image Viewer') self.setGeometry(100, 100, 800, 600) central_widget = QWidget(self) self.setCentralWidget(central_widget) layout = QHBoxLayout(central_widget) self.left_label = QLabel() self.right_label = QLabel() layout.addWidget(self.left_label) layout.addWidget(self.right_label) self.image_index = 0 self.load_image() prev_button = QPushButton('Prev', self) prev_button.move(100, 500) prev_button.clicked.connect(self.prev_image) next_button = QPushButton('Next', self) next_button.move(600, 500) next_button.clicked.connect(self.next_image) def load_image(self): path = 'images' # 文件夹路径 files = os.listdir(path) if self.image_index >= len(files): self.image_index = 0 filename = files[self.image_index] self.left_label.setPixmap(QPixmap(os.path.join(path, filename))) if self.image_index+1 < len(files): next_filename = files[self.image_index+1] self.right_label.setPixmap(QPixmap(os.path.join(path, next_filename))) def prev_image(self): self.image_index -= 1 self.load_image() def next_image(self): self.image_index += 1 self.load_image() if __name__ == '__main__': app = QApplication([]) window = ImageViewer() window.show() app.exec_()
需要注意的是,需要将图片放在一个名为“images”的文件夹中,并将该文件夹与代码放在同一个目录下。如果需要更改文件夹路径,请修改path
变量的值。
以下是一个实现此功能的示例代码:
import os from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QLabel, QVBoxLayout, QPushButton from PyQt5.QtGui import QPixmap class ImageViewer(QWidget): def __init__(self): super().__init__() # 设置窗口标题 self.setWindowTitle('Image Viewer') # 获取图片路径列表 self.image_paths = [] self.index = -1 for file in os.listdir('images'): if file.endswith(('png', 'jpg', 'jpeg', 'bmp')): self.image_paths.append(os.path.join('images', file)) # 创建左右布局和按钮 self.left_layout = QVBoxLayout() self.right_layout = QVBoxLayout() self.previous_button = QPushButton('Previous') self.next_button = QPushButton('Next') # 设置按钮的槽函数 self.previous_button.clicked.connect(self.previous_image) self.next_button.clicked.connect(self.next_image) # 将按钮添加到左布局中 self.left_layout.addWidget(self.previous_button) self.left_layout.addWidget(self.next_button) # 如果没有图片,则显示提示信息 if not self.image_paths: self.right_layout.addWidget(QLabel('No images found.')) else: # 显示第一张图片 self.index = 0 self.show_image() # 创建水平布局并添加左右布局 layout = QHBoxLayout() layout.addLayout(self.left_layout) layout.addLayout(self.right_layout) # 设置布局 self.setLayout(layout) def previous_image(self): # 显示上一张图片 if self.index > 0: self.index -= 1 self.show_image() def next_image(self): # 显示下一张图片 if self.index < len(self.image_paths) - 1: self.index += 1 self.show_image() def show_image(self): # 从文件加载图片并显示在右侧布局中 image_path = self.image_paths[self.index] pixmap = QPixmap(image_path) label = QLabel() label.setPixmap(pixmap) self.right_layout.addWidget(label) if __name__ == '__main__': app = QApplication([]) window = ImageViewer() window.show() app.exec_()
在这个示例中,我们首先获取了一个名为images
的文件夹内所有文件的路径,并将以 png、jpg、jpeg 或 bmp 结尾的文件路径添加到一个列表中。然后我们创建了左右两个垂直布局,以及一个“上一张”和一个“下一张”按钮,并将这些按钮添加到左侧布局中。
接着,我们创建了一个show_image
方法,用于从文件加载图片并在右侧布局中显示。previous_image
和next_image
方法分别用于显示之前和之后的图片。
最后,我们创建了一个ImageViewer
类,将左、右布局和按钮添加到一个水平布局中,并将整个布局设置为窗口的布局。最后启动了一个应用程序。
以下是一个简单的Python PyQt5程序,实现了一个界面,包括读取图像路径的入口,用左右两个窗口分别显示图像,并设计了上一张下一张按钮:
import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QLabel, QPushButton, QFileDialog, QHBoxLayout, QVBoxLayout from PyQt5.QtGui import QPixmap class MainWindow(QMainWindow): def __init__(self): super().__init__() # 初始化界面 self.setWindowTitle('图片查看器') self.setGeometry(100, 100, 800, 600) # 创建布局 central_widget = QWidget() self.setCentralWidget(central_widget) # 创建控件 self.label_left = QLabel() self.label_right = QLabel() self.button_prev = QPushButton('上一张') self.button_next = QPushButton('下一张') self.button_load = QPushButton('加载图片') # 添加控件到布局 hbox_top = QHBoxLayout() hbox_top.addWidget(self.label_left) hbox_top.addWidget(self.label_right) hbox_bottom = QHBoxLayout() hbox_bottom.addWidget(self.button_prev) hbox_bottom.addWidget(self.button_next) hbox_bottom.addWidget(self.button_load) vbox = QVBoxLayout() vbox.addLayout(hbox_top) vbox.addLayout(hbox_bottom) central_widget.setLayout(vbox) # 连接信号和槽 self.button_prev.clicked.connect(self.prev_image) self.button_next.clicked.connect(self.next_image) self.button_load.clicked.connect(self.load_image) # 初始化图像列表和当前图像索引 self.image_list = [] self.current_image_index = 0 def prev_image(self): if self.current_image_index > 0: self.current_image_index -= 1 self.update_image() def next_image(self): if self.current_image_index < len(self.image_list) - 1: self.current_image_index += 1 self.update_image() def load_image(self): file_path, _ = QFileDialog.getOpenFileName(self, '选择图片', '', 'Images (*.png *.xpm *.jpg)') if file_path: self.image_list.append(file_path) self.current_image_index = len(self.image_list) - 1 self.update_image() def update_image(self): left_image_path = self.image_list[self.current_image_index] if self.current_image_index < len(self.image_list) else '' right_image_path = self.image_list[self.current_image_index+1] if self.current_image_index < len(self.image_list)-1 else '' left_pixmap = QPixmap(left_image_path) right_pixmap = QPixmap(right_image_path) self.label_left.setPixmap(left_pixmap) self.label_right.setPixmap(right_pixmap) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_())
这个程序的界面如下图所示:
![图片查看器界面
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。