将全屏应用程序从Tkinter移植到Kivy

时间:2014-05-10 19:02:12

标签: python kivy

我在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())的事实?

2 个答案:

答案 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_xself.width/2,我认为它是指标签本身,请尝试root.width/2,我认为这是指根小部件,在这种情况下,{{ 1}}。

我很确定,在kv文件中,Time通常是指这些root之间的小部件(这是您当时调整的任何根的父级),{{ 1}}指的是当前小部件,而<>指的是应用实例。