调整Kivy中的按钮大小

3
import numpy as np
import kivy
kivy.require('1.0.6') # replace with your current kivy version !
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label

class myLayout(BoxLayout):
     def __init__(self, **kwargs):
         super(myLayout, self).__init__(**kwargs)

         btn1 = Button(text = "click 1", background_color=[0,0,1,0],pos=(200, 100))
         btn1.bind(on_press=self.clk1)
         btn2 = Button(text = "click 2", pos=(200, 100))
         btn2.bind(on_press=self.clk)
         btn3 = Button(text = "click 3", pos=(50, 100))
         btn3.bind(on_press=self.clk)

         self.add_widget(btn1)
         self.add_widget(btn2)
         self.add_widget(btn3)

    def clk(self, obj):
         print("Hello WOrld")

    def clk1(self, obj):
         dataset = np.genfromtxt(fname='data.txt',skip_header=1)
         print dataset

class NameApp(App):
     def build(self):
     mL = myLayout()
     return mL

if __name__ == '__main__':
    NameApp().run()    

这个程序运行良好,但是我无法弄清楚为什么按钮的大小和位置没有改变?

数据集包含数值,例如两个维度

1 2

3 4

5 6

7 8

如何在GUI中绘制这些值?


3
你现在正在使用 boxlayout,它会忽略 pos。尝试使用其他布局,例如 floatlayoutrelativelayout 或其他布局,并使用 possize_hintpos_hint。请参考这里的链接:http://kivy.org/docs/api-kivy.uix.layout.html。 - kiok46
嗨,kiok46,感谢您的建议,使用FloatLayout可以解决问题。但是我想知道如何在布局屏幕中绘图。 - Sulabh Tiwari
Ook,我会发布一个答案。 - kiok46
2个回答

5
你可以使用“浮动布局”进行工作。 将以下内容添加到你的main.py文件中。
from kivy.uix.floatlayout import FloatLayout
...
btn1 = Button(text = "click 1",pos=(200, 200),size_hint = (.1,.1))
btn2 = Button(text = "click 2", pos=(200, 100),size_hint = (.1,.1))
btn3 = Button(text = "click 3", pos=(50, 100),size_hint = (.1,.1))

或者

btn1 = Button(text = "click 1",pos_hint= {'x': .1,'top': .2},size_hint = (.1,.1))
btn2 = Button(text = "click 2", pos_hint= {'x': .4,'top': .2},size_hint = (.1,.1))
btn3 = Button(text = "click 3", pos_hint= {'x': .66,'top': .2},size_hint = (.1,.1))

请参考布局部分的这里获取有关布局的更多信息。
您可能想要查看KivyCatalogKivyShowcase编辑:1 糟糕!我忘记添加这一部分了。

如何在GUI中绘制这些值?

使用Label
self.lbl = Label(pos_hint= {'x': .73,'top': .6},size_hint = (.1,.1))
self.add_widget(self.lbl)

def clk1(self, obj):
....
self.lbl.text = str(dataset)

1
嗨,感谢您的回答。然而我有几个问题想问。使用标签只能看到结果,但无法绘制它(可视化)。您能告诉我是否可以可视化,如果可以,那么如何做呢?有人可以使用Python库(如pyplot)进行2D或3D绘图吗? - Sulabh Tiwari
请参见inclement在这里的答案。http://stackoverflow.com/questions/30157687/kivy-and-matplotlib - kiok46
嗨,是的,我看到了一些关于garden的例子,感觉还不错。我在kivy文件夹中有一个名为"garden"的目录,但是当我运行"garden install graph"命令时,它显示错误,因为它无法找到"C:\Users\stiwari\kivy",然而我的kivy路径是:"C:\Users\stiwari\kivy downloads\kivy-1.9.0",你知道出了什么问题吗? - Sulabh Tiwari

0
import kivy
kivy.require('1.0.6') # replace with your current kivy version !
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import ObjectProperty
from kivy.garden.graph import Graph, MeshLinePlot
import math
from Tkinter import Tk
from tkFileDialog import askopenfilename
import os

class myLayout(FloatLayout):
   def __init__(self, **kwargs):
       super(myLayout, self).__init__(**kwargs)
       btn1 = Button(text = "click 1",pos_hint= {'x': .1,'top': .2},size_hint = (.1,.1))
       btn2 = Button(text = "click 2", pos_hint= {'x': .4,'top': .2},size_hint = (.1,.1))
       btn3 = Button(text = "click 3", pos_hint= {'x': .66,'top': .2},size_hint = (.1,.1))

       btn1.bind(on_press=self.clk1)
       btn2.bind(on_press=self.clk2)
       btn3.bind(on_press=self.clk3)

       self.add_widget(btn1)
       self.add_widget(btn2)
       self.add_widget(btn3)

   def clk1(self, obj):
       print("Hello World")

   def clk2(self, object):
       Tk().withdraw() # we don't want a full GUI, so keep the root window from appearing
       filename = askopenfilename() # show an "Open" dialog box and return the path to the selected file
       print(filename)

   def clk3(self, object):
       graph = Graph(xlabel='X', ylabel='Y', x_ticks_minor=5,x_ticks_major=25, y_ticks_major=1,y_grid_label=True, x_grid_label=True, padding=5,
     x_grid=True, y_grid=True, xmin=-0, xmax=100, ymin=-1, ymax=1)
       plot = MeshLinePlot(color=[1, 0, 0, 1])
       plot.points = [(x, math.sin(x / 10.)) for x in range(0, 101)]
       graph.add_plot(plot)
       self.add_widget(graph)

class NameApp(App):
   def build(self):
       mL = myLayout()
       return mL

if __name__ == '__main__':
   NameApp().run()

以下是可运行的代码,但是我该如何使用画布来绘制图表并提供更改其大小和形状的选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接