我以与展示应用程序相同的方式创建了一个小部件。但是我在 api文档中没有看到任何限制输入字段宽度的内容。我该如何设置宽度?
CTextInput:
size_hint_y: None
height: '32dp'
multiline: False
hint_text: 'SNMP Community String(s)'
Run Code Online (Sandbox Code Playgroud) 我尝试的是一个更大的应用程序的一部分,但我在这里发布了理解我的问题的最低限度:
我想更改矩形的大小,该大小取决于 root.height 。
3个案例:
1)当我创建一个高度为“root.height/4”的矩形时,大小会随着我调整根窗口的大小而变化。目前为止没有问题
2)当我尝试将“root.height/4”分配给属性并在设置矩形大小时调用此属性时,出现以下错误:“TypeError:需要浮点数”。
Python 文件:
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Rectangle, Color
class BriqueApp(App):
def build(self):
return BriqueGUI()
class BriqueGUI(Widget):
pass
BriqueApp().run()
Run Code Online (Sandbox Code Playgroud)
Kv文件:
#:kivy 1.9.1
<BriqueGUI>:
h: root.height/4
color: (1,0,0,1)
canvas:
Color:
rgba: root.color
Rectangle:
size: (200, self.h)
pos: (0,0)
Run Code Online (Sandbox Code Playgroud)
3)当我尝试重新分配一个值时,例如“root.height/2”,当调用事件时(此处为on_touch_down):我的矩形的大小发生变化,但是当我调整窗口大小时,我的矩形不会调整大小用它。您可以在此处看到加载文件、单击主窗口并更改其大小的问题。
Python 文件:
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Rectangle, Color
class BriqueApp(App):
def build(self):
return BriqueGUI()
class BriqueGUI(Widget):
def on_touch_down(self, touch):
self.h = …Run Code Online (Sandbox Code Playgroud) 我读过“在 Kivy 中创建应用程序”。并且有如下代码。
from kivy.app import App
App().run()
class WeatherApp(App):
pass
if __name__ == '__main__':
WeatherApp().run()
Run Code Online (Sandbox Code Playgroud)
完成上面的代码后,书上说你在 main.py 的同一目录中创建 kv 文件。但我不知道如何创建 kv 文件。如何??帮帮我吧~~
我在遵循 Kivy 网站的说明时遇到了很多麻烦,很多步骤都没有解释,比如我应该对警告做出什么反应。
WARNING: The output directory "..." and ALL ITS CONTENTS will be REMOVED! Continue? (y/n)
Run Code Online (Sandbox Code Playgroud)
即使我选择y,该文件夹也不会被删除。
我还应该总是添加这些行:
from kivy.deps import sdl2, glewTree('C:\\Users\\<username>\\Desktop\\MyApp\\'),*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)]在 .spec 文件中?为什么它们是必要的?
Kivy 的可用信息并不多。
我在尝试学习 kivy 中的 BoxLayout 时遇到断言错误。我不知道出了什么问题。
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
class BoxLayoutApp(App):
def build(self):
return BoxLayout()
if __name__=="__main__":
BoxLayoutApp().run()
Run Code Online (Sandbox Code Playgroud)
对于 kv 代码:
<BoxLayout>:
BoxLayout:
Button:
text: "test"
Button:
text: "test"
Button:
text: "test"
BoxLayout:
Button:
text: "test"
Button:
text: "test"
Button:
text: "test"
Run Code Online (Sandbox Code Playgroud)
编辑:我尝试按照建议对 BoxLayout 进行子类化,但是我仍然面临 AssertionError。我在此处复制了完整(原始)错误消息:
Traceback (most recent call last):
File "boxlayout.py", line 12, in <module>
BoxLayoutApp().run()
File "C:\Users\user\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\app.py", line 802, in run
root = self.build()
File "boxlayout.py", line 8, in …Run Code Online (Sandbox Code Playgroud) 我正在尝试动态构建一个带有垂直 BoxLayout 的 Kivy 布局,其中包含MyRow可以在运行时更改的不同数量的自定义小部件。
每行都是一个水平的 BoxLayout
我没有使用 GridLayout,因为MyRow布局正在开发中,并且可以在不久的将来更改添加小部件等,就像这个例子一样

但通过下面的代码,我只能在窗口的左下角得到彼此堆叠的小部件。
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty
class MyRow(Widget):
a = StringProperty('a')
b = StringProperty('b')
def __init__(self, **kwargs):
super(MyRow, self).__init__(**kwargs)
class MainScreen(Widget):
rows = [['a1','b1'],['a2','b2']] #example data
mainLayout = BoxLayout(orientation='vertical', spacing=5)
def __init__(self, **kwargs):
super(MainScreen, self).__init__(**kwargs)
self.add_widget(self.mainLayout)
for r in self.rows:
row_widget = MyRow()
row_widget.a = r[0]
row_widget.b = r[1]
self.mainLayout.add_widget(row_widget)
class MyApp(App):
def build(self):
return MainScreen() …Run Code Online (Sandbox Code Playgroud) #:kivy 1.10.0
#:import CoreImage kivy.core.image.Image
#:import os os
<SelectableButton>:
# Draw a background to indicate selection
canvas.before:
Color:
rgba: (0, 0.517, 0.705, 1) if self.selected else (0, 0.517, 0.705, 1)
Rectangle:
pos: self.pos
size: self.size
Run Code Online (Sandbox Code Playgroud)
我正在尝试制作一个带有图像的按钮。然而图像被拉伸了。有没有办法让它成为“固定位置”,这样每当分辨率改变时,它就不会被拉伸(使用python)?
self.add_widget(Button(background_normal=('Image.png'),size_hint_x=(0.5),size_hint_y=(0.3),pos_hint={"x":0.3, "top":0.7}))
Run Code Online (Sandbox Code Playgroud) 这是来自 Kivy 相对布局的文档。 https://kivy.org/docs/api-kivy.uix.relativelayout.html
相对布局:此布局允许您为子项设置相对坐标。如果您想要绝对定位,请使用 FloatLayout。relativeLayout 类的行为与常规 FloatLayout 类似,只是它的子窗口小部件相对于布局定位。当将position=(0,0)的widget添加到RelativeLayout中时,当RelativeLayout的位置改变时,子widget也会移动。子窗口部件坐标保持为 (0,0),因为它们始终相对于父布局。
我发现 Floatlayout 也做了同样的事情。事实上,Floatlayout和RelativeLayout都支持绝对和相对定位,具体取决于是否使用pos_hint或pos。
实际上,无论绝对定位和相对定位如何,当布局位置发生变化时,小部件都会移动。
我遇到一个问题,Kivy 在 android 上使用 sdl2,并且工作正常,但在 Linux 上它使用 ffpyplayer,但不能。
所以我想让Kivy也在linux上使用sdl2,但是sdl2似乎根本无法在linux上工作。
$ KIVY_AUDIO=sdl2 python min_audio_example.py
[INFO ] [Audio ] Providers: audio_sdl2 (audio_ffpyplayer ignored)
[CRITICAL] [AudioSDL2 ] Unable to open mixer: b'No such audio device'
Run Code Online (Sandbox Code Playgroud)
这是一个演示问题的最小示例。
#!/usr/bin/env python
# works with:
# export KIVY_AUDIO=ffpyplayer
# fails with:
# export KIVY_AUDIO=sdl2
from kivy.app import App
from kivy.core.audio import SoundLoader
def playsound(dummy):
sound = SoundLoader.load("440Hz_44100Hz_16bit_05sec.ogg")
if sound:
print("Sound found at %s" % sound.source)
print("Sound is %.3f seconds" % sound.length)
print("sound state", sound.state)
sound.play()
print("sound state", …Run Code Online (Sandbox Code Playgroud) kivy ×10
python ×8
android ×1
pyinstaller ×1
python-2.7 ×1
python-3.x ×1
sdl-2 ×1
textinput ×1
windows-7 ×1