【问题标题】:button and label text not showing按钮和标签文本未显示
【发布时间】:2019-05-25 15:11:53
【问题描述】:

图片中的两个窗口是完全相同的副本(同一行代码),唯一的区别是右侧窗口是屏幕管理器中的一个屏幕,但右侧的窗口不知何故不显示文本。

我不确定问题是什么,在做研究时找不到任何相关的东西。

右窗口 Python 文件:

import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.config import Config
space = ""

x = [(a * 9), (a*16)]
Config.set('graphics', 'width', x[0])
Config.set('graphics', 'height', x[1])

class MainScreen(Screen):
    pass

class SecondScreen(Screen):
    pass

class ThirdScreen(Screen):
    pass


kv = Builder.load_file("main2.kv")
class ComplimentUI(App):
    def build(self):
        return kv
    def change_screen(self, x):
        scrnmanager = self.root.ids['sm']
        scrnmanager.current = x

if __name__ == "__main__":
    ComplimentUI().run()

右窗口生成器文件:(main2.kv)

#:include secondscreen.kv
#:include thirdscreen.kv

<MainScreen>:
    canvas.before:
         Color:
            rgb: .59, .74, .20
        Rectangle:
            size: self.size
            pos: self.pos
        FloatLayout:
            TextInput:
                pos_hint: {'center_x':1, 'top':.1}
                size_hint: .1,.1
                multiline: False
                font_size: 20
                font_name: "Dimbo Regular"
                background_normal: ''
                background_color: 0,0,0,0

            Button:
                text: "PLAY!"
                pos_hint: {'center_x':.5, 'center_y':.3}
                size_hint: .8, .17
                font_name: "Splatch"
                color: 0.15, .5, 0.2, 1
                font_size: 0.14 * self.width
                background_normal: ''
                background_color: 0,0,0,0
                on_press:
                print("pressed, navigating to prev screen")
                app.change_screen("screentwo")
                root.manager.transition.direction = "left"
                canvas.before:
                    Color:
                        rgb: 1,1, .8,1
                    RoundedRectangle:
                        size: self.size
                        pos: self.pos
                        radius: [4,]

ScreenManager:
    GridLayout:
        cols: 1
        ScreenManager:
            id: sm
        MainScreen:
            name: "screenone"
            id: screenone
        SecondScreen:
            name: "screentwo"
            id: screentwo
        ThirdScreen:
            name: "thirdscreen"
            id: thirdscreen[enter image description here][1]

左窗口 Python 文件:

import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.config import Config
space = "";

x = [(a * 9), (a*16)]
Config.set('graphics', 'width', x[0])
Config.set('graphics', 'height', x[1])

kv = Builder.load_file("main.kv")
class MyMainApp(App):
    def build(self):
        return kv

if __name__ == "__main__":
    MyMainApp().run()

左窗口生成器文件:(main.kv)

FloatLayout:
    canvas.before:
        Color:
            rgb: .59, .74, .20
        Rectangle:
            size: self.size
            pos: self.pos
    TextInput:
        pos_hint: {'center_x':1, 'top':.1}
        size_hint: .1,.1
        multiline: False
        font_size: 20
        font_name: "Dimbo Regular"
        background_normal: ''
        background_color: 0,0,0,0

    Button:
        text: "PLAY!"
        pos_hint: {'center_x':.5, 'center_y':.3}
        size_hint: .8, .17
        font_name: "Splatch"
        color: 0.15, .5, 0.2, 1
        font_size: 0.14 * self.width
        background_normal: ''
        background_color: 0,0,0,0
        on_press:
            print("pressed, navigating to prev screen")
            app.change_screen("screentwo")
            root.manager.transition.direction = "left"
        canvas.before:
            Color:
                rgb: 1,1, .8,1
            RoundedRectangle:
                size: self.size
                pos: self.pos
                radius: [4,]

新编辑:

正如我在下面的评论中指出的那样,secondscreen.kvthirdscreen.kv 的 FloatLayout 也会出现同样的问题,如果我把它放在左侧窗口的构建器文件中,它是正常的。但是当我把它放在屏幕管理器(如右侧窗口)内的屏幕内时,它就消失了。我所有的屏幕都发生了同样的问题。我只放mainscreen.kv 的原因是因为它是所有屏幕中最短的,但我仍然会提供文件,但只有一个版本(用于右侧窗口的那个),因为它们基本上是相同的行。 (唯一的区别是在其类名中添加了第一行,并且为了适应关卡做了轻微的缩进)

第二屏构建文件:

<SecondScreen>:
    FloatLayout:
        canvas.before:
            Color:
                rgb: .59, .74, .20
            Rectangle:
                size: self.size
                pos: self.pos
        TextInput:
            pos_hint: {'center_x':.5, 'center_y':.56}
            size_hint: .8, .3
            multiline: False
            font_size: 20
            font_name: "Dimbo Regular"
            background_normal: ''
            background_color: 1, 1, .8, 1

        Label:
            pos_hint: {'center_x':.5, 'center_y':.76}
            size_hint: .8, .07
            text: "NAME!"
            font_size: 0.8 * self.height
            font_name: "kidsrock"
            color: 0.15, .5, 0.2, 1
            background_color: 0,0,0,0
            canvas.before:
                Color:
                    rgb: 1,1, .8,1
                RoundedRectangle:
                    size: self.size
                    pos: self.pos
                    radius: [4,]

        Button:
            text: "<<<"
            size_hint: .28, .07
            pos_hint: {'center_x':.24, 'center_y':.1}
            font_name: "kidsrock"
            color: 0.15, .5, 0.2, 1
            font_size: 0.35 * self.width
            background_normal: ''
            background_color: 0,0,0,0
            on_press:
                print("pressed, navigating to prev screen")
                app.change_screen("screenone")
                root.manager.transition.direction = "right"
            canvas.before:
                Color:
                    rgb: 1,1, .8,1
                RoundedRectangle:
                    size: self.size
                    pos: self.pos
                    radius: [4,]
        Button:
            pos_hint: {'center_x':.8, 'center_y':.35}
            size_hint: .2, .07
            background_normal: ''
            background_color: 0,0,0,0
            color: 0.15, .5, 0.2, 1
            text: "ENTER"
            font_name: "kidsrock"
            font_size: 0.25 * self.width
            on_press:
                print("pressed, navigating to next screen")
                app.change_screen("thirdscreen")
                root.manager.transition.direction = "left"
            canvas.before:
                Color:
                    rgb: 1,1, .8,1
                RoundedRectangle:
                    size: self.size
                    pos: self.pos
                    radius: [4,]

第三屏构建文件:

<ThirdScreen>:
    FloatLayout:
        canvas.before:
            Color:
                rgb: .59, .74, .20
            Rectangle:
                size: self.size
                pos: self.pos
        TextInput:
            pos_hint: {'center_x':1, 'top':.1}
            size_hint: .1, .1
            multiline: False
            font_size: 20
            font_name: "Dimbo Regular"
            background_normal: ''
            background_color: 0, 0, 0, 0

        Label:
            pos_hint: {'center_x':.5, 'center_y':.71}
            size_hint: .8, .17
            text: "COMPLIMENT!"
            font_size: 20
            font_name: "kidsrock"
            color: 0.15, .5, 0.2, 1
            background_color: 0,0,0,0
            canvas.before:
                Color:
                    rgb: 1,1, .8,1
                RoundedRectangle:
                    size: self.size
                    pos: self.pos
                    radius: [4,]

        Button:
            pos_hint: {'center_x':.24, 'center_y':.1}
            size_hint: .28, .07
            font_name: "kidsrock"
            color: 0.15, .5, 0.2, 1
            font_size: 0.35 * self.width
            text: "<<<"
            background_normal: ''
            background_color: 0,0,0,0
            on_press:
                print("pressed, navigating to prev screen")
                app.change_screen("screentwo")
                root.manager.transition.direction = "right"
            canvas.before:
                Color:
                    rgb: 1,1, .8,1
                RoundedRectangle:
                    size: self.size
                    pos: self.pos
                    radius: [4,]

新 - 新编辑!:

更新 重新启动我的电脑后,它现在看起来像这样。

【问题讨论】:

  • 您在发布的 kv 文件中存在缩进问题。 SecondScreen 的屏幕截图是否正确?能否请您分享 SecondScreen 的 kv 语言。
  • 很抱歉,我让这非常混乱。首先是的,我确实认为我显示的代码的缩进是错误的,但我相信这只是因为 StackOverflows 格式,而不是代码本身。第二,不右边的屏幕不是SecondScreen,右边的窗口是MainScreen,其代码行如上图。此外,图片中显示的窗口从 2 个不同的 python 文件运行,我将尝试编辑和添加左窗口的脚本,但我不确定它会产生很大的不同。

标签: python kivy kivy-language


【解决方案1】:

根本原因 - 按钮和标签文本未显示

最可能的原因是文本的默认color 是白色([1, 1, 1, 1]),并且两个小部件的背景颜色也是白色。您需要将文本颜色设置为非白色,例如黑色 ([0, 0, 0, 1])。

文本输入框 - 不显示

由于background_normal: ''background_color: 0,0,0,0,TexInput 框在两个窗口(左和右)中都不可见。

将它们注释掉,TextInput 框将可见。

按钮的文本“PLAY” - 未显示在右侧窗口中

可能是包含 kv 文件中的某些内容,例如secondscreen.kv 和/或 thirdscreen.kv 正在/正在导致可见性。注释掉两个 kv 文件以解决问题。

示例

下面的右侧窗口示例,即使用ScreenManager,能够显示Button 的文本“PLAY”以及TextInput 框。

main-right.py

​​>
from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.lang import Builder


class MainScreen(Screen):
    pass


class SecondScreen(Screen):
    pass


class ThirdScreen(Screen):
    pass


kv = Builder.load_string("""
# :include secondscreen.kv
# :include thirdscreen.kv

<MainScreen>:
    canvas.before:
        Color:
            rgb: .59, .74, .20
        Rectangle:
            size: self.size
            pos: self.pos
    FloatLayout:
        TextInput:
            hint_text: 'Type here'
            pos_hint: {'center_x':1, 'top':.1}
            size_hint: .1,.1
            multiline: False
            font_size: 20
            # font_name: "Dimbo Regular"
            # background_normal: ''
            # background_color: 0,0,0,0

        Button:
            text: "PLAY!"
            pos_hint: {'center_x':.5, 'center_y':.3}
            size_hint: .8, .17
            #font_name: "Splatch"
            color: 0.15, .5, 0.2, 1
            font_size: 0.14 * self.width
            background_normal: ''
            background_color: 0,0,0,0
            on_press:
                print("pressed, navigating to prev screen")
                app.change_screen("screentwo")
                root.manager.transition.direction = "left"
            canvas.before:
                Color:
                    rgba: 1, 1, .8, 1
                RoundedRectangle:
                    size: self.size
                    pos: self.pos
                    radius: [4,]

GridLayout:
    cols: 1
    ScreenManager:
        id: sm
        MainScreen:
            name: "screenone"
            id: screenone
        SecondScreen:
            name: "screentwo"
            id: screentwo
        ThirdScreen:
            name: "thirdscreen"
            id: thirdscreen
""")


class RightWindow(App):
    title = "ComplimentUI"

    def build(self):
        return kv


if __name__ == "__main__":
    RightWindow().run()

输出

【讨论】:

  • 在我提供的代码中,文本的颜色是 rgba(0.15, 0.5, 0.2, 1),即左侧窗口显示的森林绿色阴影。
  • 通过运行您提供的内容,我们无法重现该问题。您需要提供更多信息,即Minimal, Reproducible Example
  • 我会进行编辑,我会尝试提供两个窗口的 python 文件,但很抱歉,我不确定还有什么可以帮助的。
  • 尝试注释掉包含文件secondscreen.kvthirdscreen.kv。请参阅我更新的帖子了解更多详细信息。
  • 在 secondscreen.kv 和 thirdscreen.kv 中也会出现同样的问题。是一样的,如果我把secondscreen.kv/thirdscreen.kv的布局放在左边的builder文件里,就正常显示了。但如果我把它放在屏幕内,在屏幕管理器(如右侧窗口)中,问题就会发生。关于文本输入,我故意这样说,如果我将它的代码行放在 FloatLayouts canvas.before 之后,我的其他小部件会以某种方式变色,所以我只是在 FloatLayouts canvas.before 之后放置一个不可见的文本输入作为第一行代码.在这一点上,我担心这只是我的一个小故障。
【解决方案2】:

我遇到了类似的问题,对我来说这个错误原来是按钮的 size_hint_x 声明。一旦我删除它,文本就可见了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多