簡體   English   中英

我編碼中的 ScreenManager 在我的程序中不起作用

[英]The ScreenManager on my coding doesn't work on my program

我的編碼有問題。 我正在嘗試讓 ScreenManager 在我的應用程序上運行。 我有三個與我的項目相關的按鈕操作:一個屏幕上的二維碼掃描器示例、一個屏幕上的清單和一個超鏈接操作按鈕。

我現在正嘗試將這三個程序與一個 single.kv 設計文件組合成一個 single.py 程序。 但是,我在編碼時遇到了“NoneType”錯誤。 如果我刪除 Builder 文件,並將 .kv 文件編輯為簡單的 GridLayout 和按鈕,編碼工作,但它將顯示為空白。

下面列出了編碼。

測試集成.py

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.image import Image
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput

class MainMenu(Screen):
    def build(self):
        self.window = GridLayout()
        self.window.cols = 1
        self.window.size_hint = (0.6, 0.7)
        self.window.pos_hint = {"center_x": 0.5, "center_y": 0.5}

        self.window.add_widget(Image(source="Are You Safe.jpeg"))

        self.greeting = Label(
            text="What's your name?",
            font_size=18,
            color='#00FFCE'
        )
        self.window.add_widget(self.greeting)
        self.user = TextInput(
            multiline=False,
            padding_y=(20, 20),
            size_hint=(1, 0.5)
        )

        self.window.add_widget(self.user)

        self.button = Button(
            text="NEXT",
            size_hint=(1, 0.5),
            bold=True,
            background_color='#00FFCE',
            background_normal=""
        )

        self.button.bind(on_press=self.callback)
        self.window.add_widget(self.button)

        return self.window


    def callback(self, instance):
        self.greeting.text = "Hello " + self.user.text + "!"

class FirstScreen(Screen):
    def checkbox_click(self, instance, value, safety):
        if value == True:
            self.ids.output_label.text = f'Well done.'
        else:
            self.ids.output_label.text = "You are recommended to acquire or purchase the missing safety equipment."

class SecondScreen(Screen):
    ...

class ThirdScreen(Screen):
    ...

class WindowManager(ScreenManager):
    pass

class MyMainApp(App):
    def build(self):
        Builder.load_file('Test Integration.kv')
        screen_manager = ScreenManager(transition="SlideTransition()")
        screen_manager.add_widget(MainMenu(name="MainMenu"))
        screen_manager.add_widget(FirstScreen(name="FirstScreen"))
        screen_manager.add_widget(SecondScreen(name="SecondScreen"))
        return screen_manager

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

測試集成.kv


LogInMenu:

<LogInMenu>:
    GridLayout:
        cols: 1
        Label:
        text: "Are You Safe? \[A project by students of Temasek Polytechnic.\]"

        Button:
            text: "Mandatory Equipment Checklist."
            on_press:
                root.manager.current = "FirstScreen"
                root.manager.transition = "right"
    
        Button:
            text: "QR Code Scanner"
            on_press:
                root.manager.current = "SecondScreen"
                root.manager.transition = "right"
    
        Button:
            text: "Link to Our Survey."
            on_press:
                root.manager.current = "ThirdScreen"
                root.manager.transition = "right"

<FirstScreen>:
    GridLayout:
        cols: 1
        Label:
            text: "A Mandatory Safety Checklist."

    BoxLayout:
        orientation: "vertical"
        size: root.width, root.height
    
        Label:
            text: "Checklist: Do you acquired all the necessary safety equipment?"
            font_size: 24
    
        GridLayout:
            cols:2
    
            Label:
                text: "Do you have your safety gloves with you?"
                font_size:16
            CheckBox:
                on_active: root.checkbox_click(self, self.active, "Do you have your safety gloves with you?")
            Label:
                text: "Do you have your safety boots with you?"
                font_size:16
            CheckBox:
                on_active: root.checkbox_click(self, self.active, "Do you have your safety boots with you?")
            Label:
                text: "Do you have your safety goggles with you?"
                font_size:16
            CheckBox:
                on_active: root.checkbox_click(self, self.active, "Do you have your safety goggles with you?")
            Label:
                text: "Do you have your helmet with you?"
                font_size:16
            CheckBox:
                on_active: root.checkbox_click(self, self.active, "Do you have your helmet with you?")
    
        Label:
            id: output_label
            text: "You are recommended to acquire or purchase the missing safety equipment."
    
        Button:
            text: "Return to Main Menu."
            on_press:
                root.manager.current = "LogInMenu"
                root.manager.transition = "left"

<SecondScreen>:
    GridLayout:
        cols: 1
        Label:
        text: "QR Code Scanner."

    Button:
            text: "Return to Main Menu."
            on_press:
                root.manager.current = "LogInMenu"
                root.manager.transition = "left"

<ThirdScreen>:
    GridLayout:
        cols: 1
        Label:
        text: "A Link to Our Survey."

    Button:
       text:"Survey on feedback."
    
       on_release:
    
          # importing webbrowser module
          import webbrowser
    
          # it will open google window in your browser
          webbrowser.open('https://forms.gle/k6cfYEU1snzpykxY9')
    
    Button:
            text: "Return to Main Menu."
            on_press:
                root.manager.current = "LogInMenu"
                root.manager.transition = "right"

<WindowManager>:
    LogInMenu:
    FirstScreen:
    SecondScreen:
    ThirdScreen:

這些是我遇到的錯誤:

編碼結果:

 Traceback (most recent call last):
   File "C:\Users\nicho\PycharmProjects\Temasek Polytechnic MP (Software App)\Test Integration.py", line 76, in <module>
     MyMainApp().run()
   File "C:\Users\nicho\PycharmProjects\Temasek Polytechnic MP (Software App)\venv\lib\site-packages\kivy\app.py", line 954, in run
     self._run_prepare()
   File "C:\Users\nicho\PycharmProjects\Temasek Polytechnic MP (Software App)\venv\lib\site-packages\kivy\app.py", line 924, in _run_prepare
     root = self.build()
   File "C:\Users\nicho\PycharmProjects\Temasek Polytechnic MP (Software App)\Test Integration.py", line 68, in build
     Builder.load_file('Test Integration.kv')
   File "C:\Users\nicho\PycharmProjects\Temasek Polytechnic MP (Software App)\venv\lib\site-packages\kivy\lang\builder.py", line 305, in load_file
     return self.load_string(data, **kwargs)
   File "C:\Users\nicho\PycharmProjects\Temasek Polytechnic MP (Software App)\venv\lib\site-packages\kivy\lang\builder.py", line 372, in load_string
     parser = Parser(content=string, filename=fn)
   File "C:\Users\nicho\PycharmProjects\Temasek Polytechnic MP (Software App)\venv\lib\site-packages\kivy\lang\parser.py", line 483, in __init__
     self.parse(content)
   File "C:\Users\nicho\PycharmProjects\Temasek Polytechnic MP (Software App)\venv\lib\site-packages\kivy\lang\parser.py", line 593, in parse
     objects, remaining_lines = self.parse_level(0, lines)
   File "C:\Users\nicho\PycharmProjects\Temasek Polytechnic MP (Software App)\venv\lib\site-packages\kivy\lang\parser.py", line 696, in parse_level
     _objects, _lines = self.parse_level(
   File "C:\Users\nicho\PycharmProjects\Temasek Polytechnic MP (Software App)\venv\lib\site-packages\kivy\lang\parser.py", line 756, in parse_level
     if current_property[:3] == 'on_':
 TypeError: 'NoneType' object is not subscriptable

如您所見,我不知道如何修復“NoneType”object TypeError。 正如帖子前面提到的,當我將 .kv 文件的命令更改為 <FirstScreen>、<SecondScreen> 和 <ThirdScreen> 上的簡單 GridLayout 和 Button 命令,並刪除 Builder.load_file(Test Integration.kv)從 Test Integration.py 文件中,編碼有效,但未顯示任何內容。 此編碼基於我的最后一年項目。

這是你的問題

screen_manager = ScreenManager(transition="SlideTransition()")

您已經創建了一個繼承自 ScreenManager 的 WindowManager class,因此您需要使用 WindowManager() 而不是 ScreenManager()。 還必須刪除引號

像這樣

screen_manager = WindowManager(transition=SlideTransition())

最后要使用的是如何使用轉換代碼的探針。 代替於

root.manager.transition = "left"

一定是這樣的

root.manager.transition.direction = "left"

這個教程可以作為一個提醒https://youtu.be/H3U29kXJlBk

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM