如何在不修改原文件的情况下调整图片大小并在Kivy中使用
不生成新文件调整Kivy背景图片大小的方案
你遇到的核心问题是:Kivy的Image组件source参数只接受文件路径,无法直接使用PIL处理后的Image对象,同时你不想创建新文件或覆盖原文件。解决思路是将PIL处理后的图片直接转换为Kivy的Texture对象,赋值给Image组件的texture属性,全程不涉及文件读写操作。
修改步骤
- 删除代码中那段无效的PIL图片处理代码(即
image = PIL.Image.open('Bg.png')到new_image.copy()的部分) - 在App的
build方法内完成图片加载、缩放,并转换为Kivy可用的Texture,直接绑定给Image组件
修改后的完整代码
from pyperclip import copy import PIL.Image from kivy.clock import Clock from kivy.uix.image import Image from kivy.uix.widget import Widget from kivy.uix.floatlayout import FloatLayout from kivy.app import App from kivy.uix.button import Button from kivy.uix.textinput import TextInput from kivy.config import Config from kivy.graphics.texture import Texture # 新增:导入Kivy纹理类 Config.set('graphics', 'full-screen', '0') Config.set('graphics', 'resizable', '0') Config.set('graphics', 'width', '600') Config.set('graphics', 'height', '200') Config.write() n = '' def btn_press(instance): print('pressed') def copied(dt): global n n = ''.join([f'||{i}||' for i in ti.text]) # 简化字符串拼接逻辑 instance.text = 'Copied!' copy(n) def notCopied(dt): instance.text = 'Copy.' Clock.schedule_once(copied, 0) Clock.schedule_once(notCopied, 0.4) class DiscordSpoilerMaker(App): def build(self): global ti fl = FloatLayout() btn = FloatLayout() w = Widget() btn.add_widget(w) # --- 核心修改:处理图片并生成Kivy纹理 --- pil_image = PIL.Image.open('Bg.png').resize((600, 200)) # 将PIL图片转换为Kivy Texture texture = Texture.create(size=(pil_image.width, pil_image.height)) texture.blit_buffer(pil_image.tobytes(), colorfmt='rgba', bufferfmt='ubyte') texture.flip_vertical() # Kivy纹理坐标系与PIL相反,需翻转校正 # 创建背景图片组件,使用生成的texture而非source bg_image = Image(texture=texture) btn.add_widget(bg_image) # --- 核心修改结束 --- ti = TextInput( pos=(10, 100), hint_text='Input your text', size_hint_y=.18, size_hint_x=.965, font_name="RFont.ttf", font_size=19, padding=9, multiline=False, background_normal='TIBg.png', background_active='TIBg.png', border=(10, 10, 10, 10) ) btn.add_widget(fl) fl.add_widget(ti) btn.add_widget(Button( text='Copy.', on_release=btn_press, size_hint=(.13, .19), pos=(505, 15), font_size=20, font_name="RFont.ttf", color=(1, 0, 0, 1), # Kivy颜色值为0-1浮点数,修正原写法 background_normal='TIBg.png', background_down='TIBg.png' )) return btn if __name__ == '__main__': DiscordSpoilerMaker().run()
补充说明
- Kivy的颜色参数需使用0-1区间的浮点数,原代码中
(255,0,0)会被自动归一化,但标准写法应为(1,0,0,1)(第四个值为透明度) - 若图片显示颜色异常,可将
colorfmt='rgba'改为colorfmt='rgb',适配原图片的色彩格式 - 代码中简化了字符串拼接逻辑,提升运行效率
内容的提问来源于stack exchange,提问作者Wh0Kt_
相关产品推荐
相关产品推荐

