python - Kivy 中小部件的位移
问题描述
使用 Kivy,我正在尝试编写一个显示绘图和按钮的简单应用程序。我有以下代码,但问题是我无法控制我的 kv 文件中图形的大小和位置。因此,我在 Kivy 左下角的默认位置有一个小图,如下所示。我确定我在这里做了一些愚蠢的事情,但不知道是什么?如果有人可以提供帮助,我将不胜感激。
这是代码:
# Imports
import matplotlib
matplotlib.use('module://kivy.garden.matplotlib.backend_kivy')
from kivy.garden.matplotlib.backend_kivyagg import FigureCanvasKivyAgg
import matplotlib.pyplot as plt
from kivy.app import App
from kivy.app import Widget
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
from kivy.core.window import Window
class Graph(Widget):
def __init__(self, **kwargs):
super(Graph, self).__init__(**kwargs)
layout = FloatLayout()
plt.plot([1, 2, 3], [1, 2, 3])
figure = plt.gcf()
self.plot = FigureCanvasKivyAgg(figure=figure)
layout.add_widget(self.plot)
self.add_widget(layout)
class Interface(FloatLayout):
pass
class TestApp(App):
def build(self):
Window.clearcolor = (1, 1, 1, 1)
return Interface()
if __name__ in ('__main__'):
TestApp().run()
以及以下 kv 设置:
Interface:
<Interface>:
padding: 10
spacing: 10
Button:
text: "Open"
size_hint_x: .15
size_hint_y: .05
pos_hint: {'x': 0.05, 'top': .55}
Graph:
size_hint_x: .5
size_hint_y: .5
pos_hint:{"x":0.5,"y":.5}
编辑:
将 Graph 更改为 FloatLayout 的子类,如下所示:
class Graph(FloatLayout):
def __init__(self, **kwargs):
super(Graph, self).__init__(**kwargs)
layout = FloatLayout()
plt.plot([1, 2, 3], [1, 2, 3])
figure = plt.gcf()
self.plot = FigureCanvasKivyAgg(figure=figure)
layout.add_widget(self.plot)
self.add_widget(layout)
启用更改图形的大小(FloatLayout)。但是,图形(FloatLayout)的位置不能改变。
解决方案
__init__
您在of中创建的布局Graph
具有 position(0, 0)
和 size (100, 100)
,因为这些是默认值,没有任何东西告诉它去其他任何地方。当你添加self.plot
时,它也有这些参数,因为布局让子填充自己。
一个直接的解决方法是让你的Graph
子类成为一个类似的布局BoxLayout
,在这种情况下,它的子类将自动被放置来填充它。
推荐阅读
- python - 使用后如何丢弃随机数?
- matlab - 从 .mat 文件中提取 HOG 特征并使用“fitcecoc”
- hybris - 是否可以在不传递 catalogType 的情况下检索产品?
- sql - 在 Redshift 中获取超过 100,000 条记录
- c++ - 如何在 C++ 中获得两个 int 的公共数字?示例:(1234, 41567) --> 1 4
- python - Pandas 数据框中的浮点数
- c - skiplist 的 C 实现中的概率论问题
- visual-studio-code - VSCode 终端未打开(退出代码:3221225794)
- android - RecyclerView 中如何使用自定义第一个元素使第一个元素的高度等于屏幕的大小
- r - Shiny - 如何保存以超越 renderTable 中的每个更改?