我在Tkinter
中编写了一个仪表板应用程序,基本上是一个全网应用程序,网格中有一些tk.Label
,并使用各种信息进行了更新。
我现在想在Kivy
中重新编码,但我在理解哲学的变化时遇到了一些问题。
Tkinter
骨架是
class Dashboard(object):
def __init__(self, parent):
self.root = parent.root
self.timestr = tk.Label(self.root)
self.timestr.configure(...)
(...)
然后.configure()
各种事物(字体,文本表等)
在Kivy
我希望通过创建多个FloatLayout
小部件来更改设计,这些小部件与上面的tk.Label
等效。我到目前为止
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.core.window import Window
class Time(Widget):
def __init__(self):
self.time = "xx:xx"
def update(self):
self.time = "9:53"
class Dashboard(Widget):
Time()
class DashApp(App):
def build(self):
dash = Dashboard()
return dash
Window.fullscreen = True
DashApp().run()
使用relavant kv
文件:
#:kivy 1.8.0
<Time>:
size: root.width, root.height / 4
pos: 0, 0
Label:
center_x: self.width / 2
top: self.top - 5
font_size: 70
text: "aaa"
启动应用程序后,它会全屏显示,但显示为空。
我应该如何表达我想要实例化Dashboad()
然后在其中包含一些小部件(例如Time()
)的事实?
答案 0 :(得分:2)
class Dashboard(Widget):
Time()
我认为你对这是做什么有误解 - 没有。 Time
对象已实例化,但未添加到Dashboard
或任何内容。这就是为什么你的应用是空白的,它只是一个Dashboard
小部件,它本身就是空白的。
您需要将Time
窗口小部件添加到信息中心,例如在__init__
:
class Dashboard(Widget):
def __init__(self, **kwargs):
super(Dashboard, self).__init__(**kwargs)
self.add_widget(Time())
由于您总是希望这样做,因此使用kv规则更容易也更好:
<DashBoard>:
Time:
你现在也会有一些混乱的定位,但看起来你还在试验它。
答案 1 :(得分:0)
而不是标签center_x
是self.width/2
,我认为它是指标签本身,请尝试root.width/2
,我认为这是指根小部件,在这种情况下,{{ 1}}。
我很确定,在kv文件中,Time
通常是指这些root
之间的小部件(这是您当时调整的任何根的父级),{{ 1}}指的是当前小部件,而<>
指的是应用实例。