Kivy - 图像查看器
在本章中,我们将在 Kivy 中构建一个简单的图像查看器应用程序。下面的代码使用 Kivy 的图像小部件和按钮来浏览所选文件夹中的图像列表。还有一个按钮可以打开 FileChooser,让用户选择不同的文件夹来查看图像。
首先,我们需要构建当前选定文件夹中所有图像文件的列表。我们使用 os.listdir() 方法来实现此目的。
import os self.idx=0 self.fillist=[] dir_path = '.' for file in os.listdir(dir_path): if file.endswith('.png'): self.fillist.append(file)
应用程序界面的构建涉及一个垂直框布局,其中图像对象放在顶部,另一个水平框布局包含三个按钮。
lo=BoxLayout(orientation='vertical') self.img= Image(source=self.fillist[self.idx]) lo.add_widget(self.img) hlo=BoxLayout(orientation='horizontal', size_hint=(1, .1)) self.b1 = Button(text = 'Dir', on_press=self.onButtonPress) self.b2 = Button(text = 'Prev', on_press=self.previmg) self.b3 = Button(text = 'Next', on_press=self.nextimg) hlo.add_widget(self.b1) hlo.add_widget(self.b2) hlo.add_widget(self.b3) lo.add_widget(hlo)
Image 小部件首先显示第一个可用图像。单击标题为"下一个"的按钮时,指向文件列表的索引将递增;单击"上一个"按钮时,索引将递减,并将索引图像文件加载到 Image 对象中。
def previmg(self, instance): self.idx-=1 if self.idx<0: self.idx=0 self.img.source=self.fillist[self.idx] def nextimg(self, instance): self.idx+=1 if self.idx>=len(self.fillist): self.idx=len(self.fillist)-1 self.img.source=self.fillist[self.idx]
第三个按钮(标题为 Dir)会弹出一个文件选择器对话框。您可以选择要查看的文件夹。
def onButtonPress(self, button): layout=GridLayout(cols=1) fw=FileChooserListView(dirselect=True, filters=["!*.sys"]) fw.bind(on_selection=self.onselect) closeButton = Button( text = "OK", size_hint=(None, None), size=(100,75) ) layout.add_widget(fw) layout.add_widget(closeButton) self.popup = Popup( title='Choose Folder', content=layout, auto_dismiss=False, size_hint=(None, None), size=(400, 400) ) self.popup.open()
示例
当前文件夹中的图像首先填充填充列表。以下是完整代码 −
from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.gridlayout import GridLayout from kivy.uix.label import Label from kivy.uix.popup import Popup from kivy.uix.image import Image from kivy.uix.button import Button from kivy.uix.filechooser import FileChooserListView from kivy.core.window import Window Window.size = (720, 400) class ImageViewerApp(App): def previmg(self, instance): self.idx -= 1 if self.idx < 0: self.idx = 0 self.img.source = self.fillist[self.idx] def nextimg(self, instance): self.idx += 1 if self.idx >= len(self.fillist): self.idx = len(self.fillist) - 1 self.img.source = self.fillist[self.idx] def onButtonPress(self, button): layout = GridLayout(cols=1) fw = FileChooserListView(dirselect=True, filters=["!*.sys"]) fw.bind(on_selection=self.onselect) closeButton = Button( text="OK", size_hint=(None, None), size=(100, 75) ) layout.add_widget(fw) layout.add_widget(closeButton) self.popup = Popup( title='Choose Folder', content=layout, auto_dismiss=False, size_hint=(None, None), size=(400, 400) ) self.popup.open() closeButton.bind(on_press=self.on_close) def onselect(self, *args): print(args[1][0]) def on_close(self, event): self.popup.dismiss() def build(self): import os self.idx = 0 self.fillist = [] dir_path = '.' for file in os.listdir(dir_path): if file.endswith('.png'): self.fillist.append(file) lo = BoxLayout(orientation='vertical') self.img = Image(source=self.fillist[self.idx]) lo.add_widget(self.img) hlo = BoxLayout(orientation='horizontal', size_hint=(1, .1)) self.b1 = Button(text='Dir', on_press=self.onButtonPress) self.b2 = Button(text='Prev', on_press=self.previmg) self.b3 = Button(text='Next', on_press=self.nextimg) hlo.add_widget(self.b1) hlo.add_widget(self.b2) hlo.add_widget(self.b3) lo.add_widget(hlo) return lo ImageViewerApp().run()
输出
运行此代码时,它将显示索引"0"处的图像 −
单击导航按钮可前进和后退。单击"Dir"按钮可选择新文件夹。