kivymd - [严重]警告,在下一帧之前完成了太多的迭代。检查您的代码,或增加Clock.max_iteration

时间:2017-09-22 16:07:14

标签: python performance kivy

这是我的main.py:

#!/usr/bin/env python3
from kivy.app import App
from kivy.lang import Builder
from kivy.metrics import dp
from kivy.properties import ObjectProperty
from kivy.uix.image import Image
from kivy.uix.widget import Widget
from kivy.uix.boxlayout import BoxLayout
from kivymd.bottomsheet import MDListBottomSheet, MDGridBottomSheet
from kivymd.button import MDIconButton
from kivymd.date_picker import MDDatePicker
from kivymd.dialog import MDDialog
from kivymd.label import MDLabel
from kivymd.list import ILeftBody, ILeftBodyTouch, IRightBodyTouch, BaseListItem
from kivymd.material_resources import DEVICE_TYPE
from kivymd.navigationdrawer import MDNavigationDrawer, NavigationDrawerHeaderBase
from kivymd.selectioncontrols import MDCheckbox
from kivymd.snackbar import Snackbar
from kivymd.theming import ThemeManager
from kivymd.time_picker import MDTimePicker

Builder.load_file('main.kv')

class BoxTopLevel(BoxLayout):
    def on_release_next_button(self):
        # self.ids['sm'].current="mainscreen"
        if not self.ids['username'].text:
            Snackbar(text="Please enter a username first").show()
            return 1
        elif ' ' in self.ids['username'].text:
            Snackbar(text="Invalid username").show()
            return 1
        elif '\\' in self.ids['username'].text:
            Snackbar(text="Invalid username").show()
            return 1
        # elif '\\' in self.ids['username'].text:
        #   Snackbar(text="No slashes please").show()
        if self.check_if_user_exists():
            Snackbar(text="Welcome %s!" % (self.ids['username'].text)).show()
            self.ids['sm'].current='mainscreen'
            return 0

    def check_if_user_exists(self):
        return True

    def set_previous_date(self, date_obj):
        self.previous_date = date_obj
        # self.root.ids.date_picker_label.text = str(date_obj)

    def show_date_picker(self):
        self.date_dialog = MDDatePicker(self.set_previous_date)
        self.date_dialog.open()

    def show_time_picker(self):
        self.time_dialog = MDTimePicker()
        self.time_dialog.open()

    def show_send_error_dialog(self):
        content = MDLabel(font_style='Body1', theme_text_color='Secondary', text="This is a dialog with a title and some text. That's pretty awesome right!", size_hint_y=None, valign='top')
        content.bind(texture_size=content.setter('size'))
        self.dialog = MDDialog(title="This is a test dialog",
                               content=content,
                               size_hint=(.8, None),
                               height=dp(200),
                               auto_dismiss=False)

        self.dialog.add_action_button("Dismiss",
                                      action=lambda *x: self.dialog.dismiss())
        self.dialog.open()

    def stop_record(self):
        print("[INFO] Recording Stopped")
        Snackbar(text="Recording stopped").show()
        self.stop_record_button = self.ids['stop_record_button']
        self.stop_record_button.disabled = True
        self.ids['record_button'].disabled = False
        rec_file_path = ''

    def record(self):
        print("[INFO] Recording")
        Snackbar(text="Recording started").show()
        self.record_button = self.ids['record_button']
        self.record_button.disabled = True
        self.ids['stop_record_button'].disabled = False

    def export(self, username, date, time, *args, **kwargs):
        username, date, time = str(username), str(date), str(time)
        file_path = '/home/cocoa/KES/'
        file_name = username+'_'+date+'_'+time+'.csv'
        csv_string = username+','+date+','+time
        for arg in args:
            if type(arg) == str:
                csv_string += ','+arg
        f = open(file_path+file_name, 'w')
        f.write(csv_string+'\n')
        f.close
        return True, file_path+file_name

    def upload(self, csv_file_path, recording_file_path):
        print(csv_file_path, recording_file_path)

    def submit(self):
        try:
            date = str(self.date_dialog.day)+'-'+str(self.date_dialog.month)+'-'+str(self.date_dialog.year)
            print(date)
            if self.export(self.ids['username'].text, date, self.time_dialog.time, 'answer1', 'answer2')[0]:
                Snackbar(text="Woo hoo! It worked!").show()
            else:
                self.show_send_error_dialog()
        except:
            Snackbar(text="Please enter the date and time and try again").show()

class SamplerApp(App):
    theme_cls = ThemeManager()
    def build(self, *args, **kwargs):
        return BoxTopLevel()


SamplerApp().run()

这是我的main.kv:

#:import Toolbar kivymd.toolbar.Toolbar
#:import ThemeManager kivymd.theming.ThemeManager
#:import MDNavigationDrawer kivymd.navigationdrawer.MDNavigationDrawer
#:import NavigationLayout kivymd.navigationdrawer.NavigationLayout
#:import NavigationDrawerDivider kivymd.navigationdrawer.NavigationDrawerDivider
#:import NavigationDrawerToolbar kivymd.navigationdrawer.NavigationDrawerToolbar
#:import NavigationDrawerSubheader kivymd.navigationdrawer.NavigationDrawerSubheader
#:import MDCheckbox kivymd.selectioncontrols.MDCheckbox
#:import MDSwitch kivymd.selectioncontrols.MDSwitch
#:import MDList kivymd.list.MDList
#:import OneLineListItem kivymd.list.OneLineListItem
#:import TwoLineListItem kivymd.list.TwoLineListItem
#:import ThreeLineListItem kivymd.list.ThreeLineListItem
#:import OneLineAvatarListItem kivymd.list.OneLineAvatarListItem
#:import OneLineIconListItem kivymd.list.OneLineIconListItem
#:import OneLineAvatarIconListItem kivymd.list.OneLineAvatarIconListItem
#:import MDTextField kivymd.textfields.MDTextField
#:import MDSpinner kivymd.spinner.MDSpinner
#:import MDCard kivymd.card.MDCard
#:import MDSeparator kivymd.card.MDSeparator
#:import MDDropdownMenu kivymd.menu.MDDropdownMenu
#:import get_color_from_hex kivy.utils.get_color_from_hex
#:import colors kivymd.color_definitions.colors
#:import SmartTile kivymd.grid.SmartTile
#:import MDSlider kivymd.slider.MDSlider
#:import MDTabbedPanel kivymd.tabs.MDTabbedPanel
#:import MDTab kivymd.tabs.MDTab
#:import MDProgressBar kivymd.progressbar.MDProgressBar
#:import MDAccordion kivymd.accordion.MDAccordion
#:import MDAccordionItem kivymd.accordion.MDAccordionItem
#:import MDAccordionSubItem kivymd.accordion.MDAccordionSubItem
#:import MDThemePicker kivymd.theme_picker.MDThemePicker
#:import MDBottomNavigation kivymd.tabs.MDBottomNavigation
#:import MDBottomNavigationItem kivymd.tabs.MDBottomNavigationItem
<BoxTopLevel>:
    orientation: 'vertical'
    Toolbar:
        id: toolbar
        title: 'Sampler'
        md_bg_color: app.theme_cls.primary_color
        background_palette: 'Primary'
        background_hue: '500'
        #left_action_items: [['menu', lambda x: app.root.toggle_nav_drawer()]]
        #right_action_items: [['dots-vertical', lambda x: app.root.toggle_nav_drawer()]]
    ScreenManager:
        id: sm
        Screen:
            name: "loginscreen"
            BoxLayout:
                spacing: 20
                padding: 20
                orientation: 'vertical'
                Widget:
                BoxLayout:
                    orientation: 'vertical'
                    padding: 10
                    spacing: 10
                    MDTextField:
                        id: username
                        hint_text: "Please enter your unique username"
                    MDCard:
                        size_hint_x: 1
                        BoxLayout:
                            padding: 10
                            spacing: 10
                            orientation: 'vertical'
                            MDLabel:
                                text: 'Please don\'t share this username'
                                theme_text_color: 'Secondary'
                                font_style: "Title"
                                size_hint_y: None
                                height: dp(36)
                            MDSeparator:
                                height: dp(1)
                            MDLabel:
                                text: "This application was developed in a hurry, So I didn't have the time to implement a proper login system. This system is temporary And I will impliment proper logins at later stages of development"
                                theme_text_color: "Primary"
                    MDRaisedButton:
                        size_hint_x: 1
                        text: "Next ->"
                        on_release: root.on_release_next_button()
        Screen:
            name: "mainscreen"
            MDBottomNavigation:
                id: bottom_navigation_demo
                MDBottomNavigationItem:
                    name: 'record_page'
                    text: "Record"
                    icon: "microphone"
                    BoxLayout:
                        orientation: 'vertical'
                        padding: 10
                        spacing: 10
                        MDCard:
                            size_hint: 1, 0.2
                            BoxLayout:
                                padding: 10
                                spacing: 10
                                orientation: 'vertical'
                                MDLabel:
                                    text: 'Hello!'
                                    theme_text_color: 'Secondary'
                                    font_style: "Title"
                                    size_hint_y: None
                                    height: dp(36)
                                MDSeparator:
                                    height: dp(1)
                                MDLabel:
                                    text: "Since the buzzer went off, now is the time when you freely record your thought through this app. I want you to be as free as possible, without having to worry about whether or not anyone else will find any meaning in what you're saying. You can go on for as long as you like, but please try and go on for three minutes. You don't have to be talking throughout, it's okay to fill the time with silence if you can't freely associate in that moment. There isn't any right or wrong here, it's not possible for there to be any right or wrong here. Do log in your stats before you start here:"
                                    theme_text_color: "Primary"
                        Widget:
                            size_hint_y: 0.02
                            BoxLayout:
                                padding: 10
                                spacing: 10
                                MDRaisedButton:
                                    id: record_button
                                    text: "Start Recording"
                                    on_press: root.record()
                                MDRaisedButton:
                                    id: stop_record_button
                                    text: "Stop Recording"
                                    on_press: root.stop_record()
                                    disabled: True
                MDBottomNavigationItem:
                    name: 'questions'
                    text: "Questions"
                    icon: "help"
                    GridLayout:
                        rows: 7
                        cols: 1
                        padding: dp(48)
                        spacing: 10
                        MDTextField:
                            id: location
                            multiline: True
                            hint_text: "Where are you?"
                        MDTextField:
                            id: task
                            multiline: True
                            hint_text: "What were you doing?"
                        MDTextField:
                            id: person_with
                            multiline: True
                            hint_text: "Who are you with"
                        MDTextField:
                            id: special_circumstances
                            multiline: True
                            hint_text: "Are there any special circumstances? (Inebriated, very sad, something big happened)"
                        MDRaisedButton:
                            id: date
                            size_hint: None, None
                            size: 3 * dp(48), dp(48)
                            on_press: root.show_date_picker()
                            text: "What date is it?"
                        MDRaisedButton:
                            text: "What time is it?"
                            size_hint: None, None
                            size: 3 * dp(48), dp(48)
                            on_press: root.show_time_picker()
                        MDRaisedButton:
                            id: submit_button
                            disabled: False
                            text: "Submit!"
                            size_hint: None, None
                            size: 3 * dp(48), dp(48)
                            on_press: root.submit()
                MDBottomNavigationItem:
                    name: 'info'
                    text: "Info"
                    icon: "information"
                    GridLayout:
                        spacing: 20
                        padding: 20
                        rows: 4
                        cols: 1
                        MDRaisedButton:
                            size_hint_x: 1
                        MDRaisedButton:
                            size_hint_x: 1
                        MDRaisedButton:
                            size_hint_x: 1
                        MDRaisedButton:
                            size_hint_x: 1

我从kivymd提供的厨房水槽复制了很多kv代码。我在Stack Overflow上找到了另一个答案,但不太明白导致错误的原因。而且由于我的代码看起来更糟,如果有人能够解释导致错误的原因以及原因,我真的很感激。在我的python文件中,我只在export函数中使用迭代一次。

此外,这是代码的输出:

[Command: /usr/bin/env -u /home/cocoa/KES/main.py]
[INFO   ] [Logger      ] Record log in /home/cocoa/.kivy/logs/kivy_17-09-22_83.txt
[INFO   ] [Kivy        ] v1.10.0
[INFO   ] [Python      ] v3.6.2 (default, Jul 20 2017, 03:52:27) 
[GCC 7.1.1 20170630]
[INFO   ] [Factory     ] 194 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_gif (img_pil, img_ffpyplayer ignored)
[INFO   ] [KivyMD      ] KivyMD version: 0.1.2
[INFO   ] [Text        ] Provider: sdl2
[INFO   ] [OSC         ] using <multiprocessing> for socket
[INFO   ] [Window      ] Provider: sdl2(['window_egl_rpi'] ignored)
[INFO   ] [GL          ] Using the "OpenGL" graphics system
[INFO   ] [GL          ] Backend used <gl>
[INFO   ] [GL          ] OpenGL version <b'4.5.0 NVIDIA 384.69'>
[INFO   ] [GL          ] OpenGL vendor <b'NVIDIA Corporation'>
[INFO   ] [GL          ] OpenGL renderer <b'GeForce GT 705/PCIe/SSE2'>
[INFO   ] [GL          ] OpenGL parsed version: 4, 5
[INFO   ] [GL          ] Shading version <b'4.50 NVIDIA'>
[INFO   ] [GL          ] Texture max size <16384>
[INFO   ] [GL          ] Texture max units <32>
[INFO   ] [Window      ] auto add sdl2 input provider
[INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
[INFO   ] [GL          ] NPOT texture support is available
[INFO   ] [Clipboard   ] Provider: sdl2(['clipboard_dbusklipper', 'clipboard_gtk3', 'clipboard_xclip', 'clipboard_xsel'] ignored)
[CRITICAL] [Cutbuffer   ] Unable to find any valuable Cutbuffer provider.
xclip - FileNotFoundError: [Errno 2] No such file or directory: 'xclip'
  File "/usr/lib/python3.6/site-packages/kivy/core/__init__.py", line 59, in core_select_lib
    fromlist=[modulename], level=0)
  File "/usr/lib/python3.6/site-packages/kivy/core/clipboard/clipboard_xclip.py", line 17, in <module>
    p = subprocess.Popen(['xclip', '-version'], stdout=subprocess.PIPE)
  File "/usr/lib/python3.6/subprocess.py", line 707, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.6/subprocess.py", line 1333, in _execute_child
    raise child_exception_type(errno_num, err_msg)

xsel - FileNotFoundError: [Errno 2] No such file or directory: 'xsel'
  File "/usr/lib/python3.6/site-packages/kivy/core/__init__.py", line 59, in core_select_lib
    fromlist=[modulename], level=0)
  File "/usr/lib/python3.6/site-packages/kivy/core/clipboard/clipboard_xsel.py", line 16, in <module>
    p = subprocess.Popen(['xsel'], stdout=subprocess.PIPE)
  File "/usr/lib/python3.6/subprocess.py", line 707, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.6/subprocess.py", line 1333, in _execute_child
    raise child_exception_type(errno_num, err_msg)

[WARNING] [MDBottomNavigation] 50.0dp is less than the minimum size of 80dp for a MDBottomNavigationItem. We must now expand to 168dp.
[WARNING] [MDBottomNavigation] 33.333333333333336dp is less than the minimum size of 80dp for a MDBottomNavigationItem. We must now expand to 168dp.
[INFO   ] [Base        ] Start application main loop
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[CRITICAL] [Clock       ] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute
[INFO   ] [Base        ] Leaving application in progress...
[Finished in 7.724s]

2 个答案:

答案 0 :(得分:0)

这适用于我尽量不要将MDRaisedButton size_hint更改为1它引发了这个时钟错误,我的建议是不要更改任何kivymd按钮size_hint它是默认情况下无而是你可以改变dp中的大小

答案 1 :(得分:0)

此错误在 KivyMD 的 MDRaisedButton 中仍然存在。一个简单的解决方法是使用 size_hint 而不是 size_hint_x

例如在你的情况下,替换

MDRaisedButton:
    size_hint_x: 1

MDRaisedButton:
    size_hint: 1., None