Python kivy只显示循环生成的最后一个标签

时间:2017-11-21 22:14:57

标签: python user-interface kivy

最后一天我遇到了非常恼火的表现我的节目。 Mabye首先展示截图,描述错误,并在finnaly显示代码。 enter image description here

如您所见,Coin是一个包含几个子按钮的按钮。我在循环中生成这些小部件并动态添加到图层。 但它只在最后一次迭代中正常工作。 请查看代码。 这是一个代码" Coin Button:class。 请注意,例如:button apx,Refresh,H,DH和D是一个类的成员

class SubButtonRefreshCoinData(Button):
    def __init__(self, coin_name, **kwargs):
        super(SubButtonRefreshCoinData, self).__init__(**kwargs)
        self.CoinName = coin_name
        self.text = "Refresh"
    def on_press(self):
        PopupNotImplementedItem().open()

class SubButtonCoinName(Button):
    def __init__(self, **kwargs):
        super(SubButtonCoinName, self).__init__(**kwargs)
        self.text = r'[color=ff3333]{}[/color]'.format(kwargs["text"])
        self.markup = True
        self.font_size='20sp'

class SubButtonGoToCoinHistory(Button):
    def __init__(self, coin_name, **kwargs):
        super(SubButtonGoToCoinHistory, self).__init__(**kwargs)
        self.CoinName = coin_name
        self.text = "H"
    def on_press(self):
        subprocess.Popen(f'py HistoryWindow.py {self.CoinName}', shell=True)

class SubButtonDeleteCoin(Button):
    def __init__(self, coin_name, **kwargs):
        super(SubButtonDeleteCoin, self).__init__(**kwargs)
        self.CoinName = coin_name
        self.text = "D"
    def on_press(self):
        PopupNotImplementedItem().open()

class SubButtonDeleteCoinHistory(Button):
    def __init__(self, coin_name, **kwargs):
        super(SubButtonDeleteCoinHistory, self).__init__(**kwargs)
        self.CoinName = coin_name
        self.text = "DH"
        print("sdfecvsdcdfwreafsq3456tedcqr4536wtger34r5cedwt4g5aced   erf34")
    def on_press(self):
        PopupNotImplementedItem().open()

现在,请看一下Builder类的这些部分:

class CoinButton(FloatLayout):
    def __init__(self, coin_name, **kwargs):
        super(CoinButton, self).__init__(**kwargs)
        self.CoinName = coin_name
        topHalfLayout = BoxLayout(pos_hint={"top":1}, size_hint = [1,0.49], orientation = "horizontal")
        topHalfLayout.add_widget(SubButtonCoinName(text=str(self.CoinName)))
        topHalfLayout.add_widget(SubButtonRefreshCoinData(self.CoinName))
        self.add_widget(topHalfLayout)

        downHalfLayout = BoxLayout(pos_hint={"down":1}, size_hint = [1,0.49], orientation = "horizontal")
        downHalfLayout.add_widget(SubButtonGoToCoinHistory(self.CoinName))
        downHalfLayout.add_widget(SubButtonDeleteCoinHistory(self.CoinName))
        downHalfLayout.add_widget(SubButtonDeleteCoin(self.CoinName))
        self.add_widget(downHalfLayout)

正如你所看到的,一切似乎都是正确的,但只有一个类可见。 在类SubButtonDeleteCoinHistory我累了原始调试这个问题,看看这个代码已经运行了。正如我在控制台中看到的那样,文本打印了3次,这是正确的值。

1 个答案:

答案 0 :(得分:0)

我不确定这里发生了什么,但是我试了一下。我相信每次初始化CoinButton时,底部按钮都会相对于FloatLayout添加,并使用pos_hint:向下按下kivy应用程序窗口下的按钮。但对于我的生活,当将下降值改为各种整数和浮点数时,没有任何变化。最好的方法是使用pos_hint' y'因为我们知道按钮的高度是0.49,所以顶部可以从0.5开始到0.99,底部可以从0开始到0.49。

topHalfLayout = BoxLayout(pos_hint={"y":0.5},size_hint = [1,0.49], orientation = "horizontal")
......
downHalfLayout = BoxLayout(pos_hint={"y":0},size_hint = [1,0.49], orientation = "horizontal")

我使用的另一个更好的方法是创建另一个包含顶部和底部布局的BoxLayout,允许FloatLayout将窗口小部件添加为一件事。在我看来,它提供了更好的间距。 '在[[top / bottom]]之外'

outside = BoxLayout(pos_hint={"top":1},size_hint = [1,2*0.49], orientation = "vertical")
......
topHalfLayout = BoxLayout(size_hint = [1,0.49], orientation = "horizontal")
......
outside.add_widget(topHalfLayout)
......
downHalfLayout = BoxLayout(size_hint = [1,0.49], orientation = "horizontal")
......
outside.add_widget(downHalfLayout)
self.add_widget(outside)