无法使用猕猴桃语言切换屏幕

时间:2019-05-19 20:55:05

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

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

问题我面对:  1.按钮放在角落,我希望它的大小可以全屏显示,但是很小

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

Chat.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()

我的输出#我无法添加图像,因此发布了输出链接

enter image description here

我正在从youtube教程中练习。

我已经从堆栈溢出中检查了很多代码,但是我的代码中没有看到问题。

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

可以让我知道可能是什么问题。

2 个答案:

答案 0 :(得分:0)

您不需要在ScreenManager内添加Widget。 所以

class ChatGUI (ScreenManager):

在python文件和

<ChatGUI>:
     MainWindow:
     SecondWindow:

在kv文件中 我所做的就是为了使您的示例有效而已。

Chat.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()

答案 1 :(得分:0)

问题1-小部件@左下角&未全屏显示?

  

按钮放在角落,我希望它的大小已满   窗户但是很小

根本原因

  1. “按钮”小部件出现在左下角,因为其根是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-在释放按钮屏幕上未切换?

  

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

根本原因

松开按钮时,屏幕未切换,因为该应用的根目录不是ScreenManager

解决方案

问题有两种选择。

选项1-使用布局作为根

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

Py文件

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

kv文件

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

摘要-选项1

main1.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()

main1.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-使用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

main2.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()

main2.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"