当前位置:   article > 正文

python:使用tkinter&pyqt搭建可视化工具_tkinter可视化设计工具

tkinter可视化设计工具

Tkinter

示例

下面是一个示例代码,实现了在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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

PyQt5

示例1

下面是一个简单的示例代码,演示如何使用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_())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95

在这个程序中,我们创建了一个 ImageViewer 类,继承自 QWidget。该类包含了两个 QLabel 和两个 QPushButton,以及一些与图像加载和显示相关的方法。

__init__ 方法中,我们初始化了图像列表和当前图像索引,并创建了左右两个 QLabel 和按钮,并为按钮的点击事件绑定了相应的方法。接着,我们创建了一个水平布局,将左右两个 QLabel 放置在该布局中。然后,我们创建了一个垂直布局,将水平布局和两个按钮放置在该布局中。最后,我们将垂直布局设置为该窗口的主布局。

show_image 方法中,我们加载当前图像和下一张图像,并将它们显示在左右两个 QLabel 中。我们使用 QPixmap 类加载图像,并使用 scaledToHeight 方法将图像缩放到指定高度,以避免图像太大而导致显示异常。

show_prev_imageshow_next_image 方法中,我们分别将当前图像索引减一和加一,然后调用 show_image 方法显示新的图像。我们还添加了一些边界检查,确保不会越界。

最后,我们创建了一个 QApplication 实例,创建了一个 ImageViewer 实例,并将它显示出来。我们调用 sys.exit 方法确保程序在关闭窗口时能够正常退出。

示例2

以下是一个简单的实现代码,将文件夹中的图片轮流在左右两个窗口内显示,并且添加了上一张和下一张按钮:

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_()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

需要注意的是,需要将图片放在一个名为“images”的文件夹中,并将该文件夹与代码放在同一个目录下。如果需要更改文件夹路径,请修改path变量的值。

示例3

以下是一个实现此功能的示例代码:

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_()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73

在这个示例中,我们首先获取了一个名为images的文件夹内所有文件的路径,并将以 png、jpg、jpeg 或 bmp 结尾的文件路径添加到一个列表中。然后我们创建了左右两个垂直布局,以及一个“上一张”和一个“下一张”按钮,并将这些按钮添加到左侧布局中。

接着,我们创建了一个show_image方法,用于从文件加载图片并在右侧布局中显示。previous_imagenext_image方法分别用于显示之前和之后的图片。

最后,我们创建了一个ImageViewer类,将左、右布局和按钮添加到一个水平布局中,并将整个布局设置为窗口的布局。最后启动了一个应用程序。

示例4

以下是一个简单的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_())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

这个程序的界面如下图所示:

![图片查看器界面

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/432370?site
推荐阅读
相关标签
  

闽ICP备14008679号