- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 64x64 的图 block 创建一个“ map 编辑器”。单击并更改位置处的图 block 时,我需要更新 Canvas 。我最初用
设置 Canvaswith self.canvas:
Rectangle(source = 'image.png')
在一节课中,然后在我的 touch_down 课中我打电话
with self.canvas:
Rectangle(source = 'newImage.png')
在我更改图像以更新它之后。
我已经能够让它更新,但我每次都必须创建一个新图像,它似乎不会更新,因为我已经添加了那个带有特定源图像的矩形,并且没有看到图像已经变了?
回应 Ryan P
仍然没有。我试过了
Class mypaintwidget(Widget): #This is added as a widget to my layout
def on_touch_down(self, touch):
with self.canvas:
self.rect = Rectangle(source = 'image.png')
tilepng = pil.open('64x64tile.png') #pil is Python Image Library
tilemap = pil.open('image.png')
tilemap.paste(tilepng,location)
tilemap.save('newimage.png')
self.rect.source = 'newimage.png'
只会更新一次。然后什么都没有(但仍会保存该图像,但不会显示给我。
最佳答案
您需要修改 Rectangle
指令(或删除和替换,但修改更容易):
with self.canvas:
self.rect = Rectangle(source='image.png')
然后:
self.rect.source = 'newImage.png'
至于问题的第二部分,问题是图像在加载到 Kivy 时会被缓存。所以当你保存 newimage.png
然后重新加载它,Kivy 知道你已经加载了 newimage.png
.对于 Kivy 应用程序来说,这并不是一个好的设计。
此外,创建 Rectangle
在on_touch_down
意味着你最终创建了一个新的 Rectangle
每次按下小部件时,您只会添加越来越多不必要的绘图指令。
您可能还会注意到,当您将多个这些小部件添加到布局时,它们都会以窗口的完整尺寸呈现在同一位置。小部件不受限于在其区域中绘制,并且可以在应用程序内的任何位置绘制。您需要确保 Rectangle
指令知道在哪里绘制,通过它 size
和 pos
参数。
最后,您可以只显示一张叠加在另一张上,而不是保存图片。这将更加高效,并且不需要使用唯一的文件名或扰乱缓存系统。
你绝对应该看看 Kivy language (kv)因为使用它设计小部件和布置您的应用程序要容易得多。
这是使用 kv 执行此操作的示例:
<TileWidget>:
tilesource: ''
canvas:
Color:
rgba: 1, 1, 1, 1
Rectangle:
size: self.size
pos: self.pos
source: 'image.png'
Color:
a: 1 if self.tilesource else 0
Rectangle:
size: self.size
pos: self.pos
source: self.tilesource
现在我将解释所有这些的作用。
<TileWidget>:
这是一个类规则,因为名字被<>
包围着.它将应用于 TileWidget
的所有实例.
tilesource: ''
我们在这里 setting the value of the property tilesource
.但是tilesource
不是 Widget
上的属性类(class)!不用担心。在 kv 中,当你像这样给一个不存在的属性赋值时,该属性将被自动创建。由于我们分配给属性的值是一个字符串,Kivy 会意识到我们希望它是一个 StringProperty
。 .
通过创建此属性,我们可以从外部影响此小部件。稍后我们将使用此属性的值来显示图像。
canvas:
就像使用with self.canvas:
一样来自 Python 中的类。
Color:
rgba: 1, 1, 1, 1
在 canvas
里面 block ,我们可以添加绘图说明。我们从 Color
instruction 开始,因为您不知道当前设置的颜色是什么。这种颜色将为我们显示的图像着色,而我们不需要任何着色,因此我们使用全白。
Rectangle:
size: self.size
pos: self.pos
source: 'image.png'
现在我们要渲染第一张图片。我们确保 Rectangle
的大小和位置与小部件匹配。在 kv 中,这样做会自动创建一个绑定(bind)。如果小部件四处移动,它的大小将会改变,并且 Rectangle
将更新自身以匹配。
Color:
a: 1 if self.tilesource else 0
这一次,我们知道颜色设置为什么。但是,在设置图像之前,我们不想绘制任何其他内容。在 kv 中,属性将接受任何 Python 值。这意味着您可以使用 ternary expressions像这个,或函数调用,或算术等。所以如果 self.tilesource
计算结果为 False(就像一个空字符串,我们在上面设置的默认值)然后 a
颜色(alpha 分量)的属性将设置为 0,否则将为 1。
Rectangle:
size: self.size
pos: self.pos
source: self.tilesource
最后,我们渲染选定的图像。
现在,要创建小部件本身,我们只需要一点 Python:
class TileWidget(Widget):
def on_touch_down(self, touch):
if self.collide_point(*touch.pos):
self.tilesource = '64x64tile.png'
return True
return super(TileWidget, self).on_touch_down(touch)
使用 collide_point
很重要处理触摸时。就像小部件可以在应用程序中的任何地方绘制一样,它们也可以处理应用程序中任何地方的触摸。这确保触摸在操作之前实际上在我们的小部件的范围内。 内部 collide_point
block ,我们将返回 True 让 Kivy 知道我们已经处理了这个触摸,没有其他东西应该处理它。否则,我们调用 super()
让默认处理程序接管。
关于Python Kivy Canvas 不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27712809/
我正在准备在 kivy 中做一个进度条,我可以用它构建应用程序,但是当我运行一个函数(循环)时它不能被更新,我该怎么做? 这是我的代码: 导入库: from kivy.app import App f
为猕猴桃中的按钮创建圆角的首选方法是什么? 还有其他同样可行的方法来执行此任务吗?谢谢。 最佳答案 这是一个棘手的问题。就我而言,Widgets始终是矩形。但是我们可以更改背景,并分别使用backgr
我是kivy的新手。我有一个按钮可以刷新数据库中的列表项,这是绑定(bind)到该按钮的函数: def refresh_account(self): self.ids.grid.clear_w
我正在尝试使用 NumericProperty,但在尝试将其用作值时出现类型错误 我的代码是这样的 from kivy.properties import NumericProperty from k
在按钮中组合图像/图标和文本的首选方法是什么?例如,您将如何使用 text = 'my button' 创建按钮,以及该文本左侧的图形图标? 最佳答案 关于问题#2。 Kivy 的工作方式是嵌入 Wi
在 kivy 中,您如何使用自动居中的多行文本创建按钮或标签?如果你做类似的事情,Button(text = 'my button\nthis is my button') ,似乎只有一条线会居中,而
我知道如何制作彩色背景,但我似乎找不到任何有用的内容将图像设置为背景,并且非常感谢您对我的代码的任何帮助。 这是我的 .py 文件: from kivy.app import App from kiv
我的 Kivy 语言文件有许多 font_size 属性,所有属性都具有相同的值,是否可以在 KV lang 中分配变量? 当前 KV 文件示例: #User ID Label:
我有一个使用许多标签的 kivy 应用程序。是否可以从列表中获取它们的值?例如(但这不起作用) Label: text:root.label_value[0]
任何人都可以帮助我使用任何 sdk 在 kivy 应用程序中实现广告。 Revmobs 已停止支持 Kivy。 任何其他实现广告的方法也可以使用。 谢谢 最佳答案 我在 上取得了成功AdBuddiz
基维 gesture documentation有点缺乏,仅指手势示例。 我想知道为什么 Kivy 不提供任何辅助方法,例如 on_swipe_left、on_swipe_up 等。最好将 minsc
我目前使用的是 python 2.7.9。我试过重新安装 cython 并更新所有依赖项,但它没有用。我不知道 Buildozer 或 Cython 有什么问题。该应用程序直接从终端正常运行。 #er
Kivy 文档指定 "each widget in Kivy already have by default their Canvas" .然而,在实践中,小部件似乎持有对整个窗口的共享 Canvas
我是 Python 库 kivy 的新手。我找到了额外的库 kivy-md,它有非常漂亮的 ui 元素。目前我想从字典变量创建许多 MDTextField 小部件,例如 # text_fields.p
python 3.4基维 1.10.0 我正在尝试使用 Kivy Animation 类来为我的 Image 类制作动画。这是因为我想分别修改每个图像的 anim_delay 和位置值。 我想修改图像
我正在尝试使用 kivy 启动器在我的 android 上启动我的应用程序,这样我就可以在较小的屏幕上看到小部件位置/大小发生了什么。 当我启动时,它崩溃了。 所以...我猜我在我的应用程序中做了一些
有谁知道如何在 Kivy 中增加 MeshLinePlot 的线宽? 谢谢 更新 我从@Ikolim 那里得到了关于修改 kivy.graph 中的 LinePLot 函数的答案 class Line
如何使用 Kivy 更改窗口的大小。我一直在四处寻找,除了进入窗口的大小之外,我几乎可以更改所有内容。 从示例图片文件: 主文件 #!/usr/bin/kivy ''' Pictures demo =
我试图在 Windows 上安装 kivy 设计器。我按照步骤操作,但是当我尝试运行时 python -m designer 我收到以下错误: [INFO ] [Kivy ] v1.
我正在尝试让我的 python 和 kivy 文件打开一个弹出窗口。它说我的 Boxlayout 对象没有属性“open_popup” 这是我的Python代码: from kivy.app impo
我是一名优秀的程序员,十分优秀!