【问题标题】:Unable to switch screens using kivy language无法使用kivy语言切换屏幕
【发布时间】:2019-05-19 20:55:04
【问题描述】:

我是 Kivy 语言的新手。我正在尝试构建一个简单的程序来在两个屏幕之间切换。第一个屏幕包含一个按钮,on_release 它将切换到第二个屏幕。单击第二个屏幕上的按钮将进入第一个屏幕。

我面临的问题: 1. 按钮放在角落里,我希望它的大小是全窗口,但它很小

  1. 单击并释放按钮不会显示任何效果。

聊天.kv

<ChatGUI>:
    MainManager:
        MainWindow:
        SecondWindow:

<MainWindow>:
    name: "main"
    Button:
        text:"to second window"
        on_release:app.root.current="second"

<SecondWindow>:
    name: "second"
    Button:
        text:"back to main"
        on_release:app.root.current="main"

python代码:

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.scrollview import ScrollView
from kivy.graphics import Rectangle, Color, Canvas
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.core.window import Window
from kivy.config import Config
from kivy.lang import Builder

class ChatGUI(Widget):
    present=Builder.load_file("Chat.kv")
class MainWindow(Screen):
    pass
class SecondWindow(Screen):
    pass
class MainManager(ScreenManager):
    pass

class ChatApp(App):
    def build(self):
        return ChatGUI()

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

我的输出#我无法添加图片,所以发布了输出链接

我正在通过 youtube 教程练习。

我检查了许多堆栈溢出代码,但我的代码中没有发现问题。

输出应该显示占据整个窗口大小的按钮并且on_release它应该切换到下一个屏幕。

你能告诉我可能是什么问题吗?

【问题讨论】:

    标签: python python-3.x kivy kivy-language


    【解决方案1】:

    您无需在Widget 中添加ScreenManager。 所以

    class ChatGUI (ScreenManager):
    

    在python文件中

    <ChatGUI>:
         MainWindow:
         SecondWindow:
    

    在 kv 文件中 这就是我为使您的示例正常工作所做的全部更改。

    聊天.kv

    <ChatGUI>:
        MainWindow:
        SecondWindow:
    
    <MainWindow>:
        name: "main"
        Button:
            text:"to second window"
            on_release:app.root.current="second"
    
    <SecondWindow>:
        name: "second"
        Button:
            text:"back to main"
            on_release:app.root.current="main"
    

    main.py

    from kivy.app import App
    from kivy.uix.label import Label
    from kivy.uix.widget import Widget
    from kivy.uix.gridlayout import GridLayout
    from kivy.uix.textinput import TextInput
    from kivy.uix.button import Button
    from kivy.uix.scrollview import ScrollView
    from kivy.graphics import Rectangle, Color, Canvas
    from kivy.uix.screenmanager import ScreenManager,Screen
    from kivy.core.window import Window
    from kivy.config import Config
    from kivy.lang import Builder
    
    class ChatGUI(ScreenManager):
        present=Builder.load_file("Chat.kv")
    
    class MainWindow(Screen):
        pass
    class SecondWindow(Screen):
        pass
    
    class ChatApp(App):
        def build(self):
            return ChatGUI()
    
    if __name__=="__main__":
        ChatApp().run()
    

    【讨论】:

      【解决方案2】:

      问题 1 - 小部件@左下角而不是全窗口?

      按钮放在角落里,我希望它的大小是完整的 窗户很小

      根本原因

      1. Button 小部件出现在左下角,因为根是 Widget 并且没有提供位置(pospos_hint)。因此,使用了 (0, 0) 的默认位置。
      2. size 不是一个完整的窗口,因为默认情况下Widget 的大小是 (100 x 100) 或默认 size_hint 是 (1, 1)。

      Kivy Widget » Default values

      • Widget 不是Layout:它不会改变其子项的位置或大小。如果您想控制定位或 调整大小,使用Layout
      • 小部件的默认大小为 (100, 100)。仅当父级是 Layout 时才会更改。例如,如果您在 按钮,标签不会继承按钮的大小或位置 因为按钮不是布局:它只是另一个小部件。
      • 默认的 size_hint 是 (1, 1)。如果父级是布局,则小部件大小将是父级布局的大小。

      问题 2 - 释放按钮屏幕未切换?

      单击并释放按钮不会显示任何效果。

      根本原因

      释放按钮时屏幕没有切换,因为App的根不是ScreenManager

      解决方案

      问题有两种选择。

      选项 1 - 使用 Layout 作为根

      此选项使用BoxLayout 作为根并需要以下增强功能。 Layout 可以是 GridLayoutBoxLayoutFloatLayout 等。

      Py 文件

      1. 用 BoxLayout 替换小部件
      2. present = Builder.load_file(...) 替换为Builder.load_file(...)
      3. Builder.load_file(...) 移出class ChatGUI() 并添加pass

      kv 文件

      1. 在实例化对象下添加id: smMainManager:
      2. app.root.current 替换为app.root.ids.sm.current

      片段 - 选项 1

      ma​​in1.py

      from kivy.app import App
      from kivy.uix.boxlayout import BoxLayout
      from kivy.uix.screenmanager import ScreenManager, Screen
      from kivy.lang import Builder
      
      
      Builder.load_file("main1.kv")
      
      
      class ChatGUI(BoxLayout):
          pass
      
      
      class MainWindow(Screen):
          pass
      
      
      class SecondWindow(Screen):
          pass
      
      
      class MainManager(ScreenManager):
          pass
      
      
      class ChatApp(App):
          def build(self):
              return ChatGUI()
      
      
      if __name__ == "__main__":
          ChatApp().run()
      

      ma​​in1.kv

      <ChatGUI>:
          MainManager:
              id: sm
              MainWindow:
              SecondWindow:
      
      <MainWindow>:
          name: "main"
          Button:
              text: "to second window"
              on_release: app.root.ids.sm.current="second"
      
      <SecondWindow>:
          name: "second"
          Button:
              text: "back to main"
              on_release: app.root.ids.sm.current="main"
      

      选项 2 - 以 root 身份使用 ScreenManager

      此选项需要以下增强功能:

      Py 文件

      1. 删除导入语句,from kivy.uix.widget import Widget
      2. 删除class ChatGUI()
      3. return ChatGUI() 替换为return MainManager()
      4. present = Builder.load_file(...) 替换为Builder.load_file(...)

      kv 文件

      1. 删除类规则,:在kv文件中
      2. 将 MainManager: 替换为类规则,:

      片段 - 选项 2

      ma​​in2.py

      from kivy.app import App
      from kivy.uix.screenmanager import ScreenManager, Screen
      from kivy.lang import Builder
      
      
      Builder.load_file("main2.kv")
      
      
      class MainWindow(Screen):
          pass
      
      
      class SecondWindow(Screen):
          pass
      
      
      class MainManager(ScreenManager):
          pass
      
      
      class ChatApp(App):
          def build(self):
              return MainManager()
      
      
      if __name__ == "__main__":
          ChatApp().run()
      

      ma​​in2.kv

      <MainManager>:
          MainWindow:
          SecondWindow:
      
      <MainWindow>:
          name: "main"
          Button:
              text: "to second window"
              on_release: app.root.current="second"
      
      <SecondWindow>:
          name: "second"
          Button:
              text: "back to main"
              on_release: app.root.current="main"
      

      【讨论】:

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