KivyMD应用程序滚动视图超出边界

2024-09-24 22:30:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我建立了一个kivy应用程序,它接收来自服务器的消息,将其保存到文本文件中,并将文本文件显示在屏幕上。但是,文本总是超过ScrollView小部件,并进入其他一些小部件,如下图所示。在

有什么办法解决这个问题吗?任何帮助都将不胜感激。谢谢您。在

enter image description here

这是我的代码:

#Todo: fix line 334 AttributeError
#Remove the upload button also
#Error Fixed
#Todo: fix message received exceeds border error
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ObjectProperty, StringProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.image import Image
from kivymd.dialog import MDDialog
from kivymd.theming import ThemeManager
from kivymd.navigationdrawer import NavigationLayout
from kivymd.list import OneLineAvatarListItem, ILeftBody
from kivymd.toast import toast
from kivymd.dialog import MDDialog
from kivy.uix.popup import Popup
from threading import Thread

import socket


sock = socket.socket()
sock.connect(('127.0.0.1', 6818))
sock.sendall(b"add_contact hello llo")

sock = socket.socket()
sock.connect(('127.0.0.1', 6818))

sock.sendall(b'new llo')


class MyLayout(BoxLayout):
    scr_mngr = ObjectProperty(None)

    def check_data_login(self):
        username = self.scr_mngr.screen1.username.text
        password = self.scr_mngr.screen1.password.text

        print(username)
        print(password)
        if username == "KivyMD" and password == "kivy":
            self.ids["wrongpass"].text = ""
            self.change_screen("screen2")
        else:
            self.ids["wrongpass"].text = "Wrong username or password, please try again"

    def change_screen(self, screen, *args):
        self.scr_mngr.transition.direction = 'left'
        self.scr_mngr.current = screen

    def back_to_chat(self):
        self.scr_mngr.transition.direction = 'right'
        self.scr_mngr.current = 'screen2'


class nav_layout(NavigationLayout):
    def print_text(self):
        print('hello')

    def check_data_login(self):
        username = self.ids.screen1.username.text
        password = self.ids.screen1.password.text

        print(username)
        print(password)
        if username == "KivyMD" and password == "kivy":
            Thread(target=self.recover_data).start()
            self.change_screen("screen2")
            self.ids.wrongpass.text = ""
        else:
            self.ids.wrongpass.text = \
                "Wrong username or password, please try again"

    def recover_data(self):
        print('started')
        while True:
            data = sock.recv(1024)
            data = data.decode()
            if data:
                print(data)
                data = data.split()
                data = data[-1] + ": " + ' '.join(data[:-1])
                r = data + '\n'
                open('chat1.txt', 'a+').write(r)#Fix The the Attribute Error that occurs when a message is sent!!!!!
                e = open('chat1.txt', 'r').readlines()
                self.ids.Chat_String.text = '\n\r'.join(e)
                print(data)

    def change_screen(self, screen, *args):
        self.ids.scr_mngr.transition.direction = 'left'
        self.ids.scr_mngr.current = screen

    def back_to_chat(self):
        self.ids.scr_mngr.transition.direction = 'right'
        self.ids.scr_mngr.current = 'screen2'

    def logout(self):
        # logout function, returns to screen 1
        self.ids.scr_mngr.current = 'screen1'
class UploadPopup(Popup):
    def load(self, path, selection):
        print(path, selection) 


KV = """
#:import Toolbar kivymd.toolbar.Toolbar
#:import MDNavigationDrawer kivymd.navigationdrawer.MDNavigationDrawer
#:import NavigationLayout kivymd.navigationdrawer.NavigationLayout
#:import NavigationDrawerDivider kivymd.navigationdrawer.NavigationDrawerDivider
#:import NavigationDrawerToolbar kivymd.navigationdrawer.NavigationDrawerToolbar
#:import MDTextField kivymd.textfields.MDTextField
#:import MDSeparator kivymd.card.MDSeparator
#:import MDThemePicker kivymd.theme_picker.MDThemePicker
#:import CardTransition kivy.uix.screenmanager.CardTransition
#:import Factory kivy.factory.Factory


<MDCustomIconItem>:
    text: root.text

    AvatarSampleWidget:
        source: root.icon

<UploadPopup>:
    id: popup
    title: "Upload"
    BoxLayout:
        FileChooserIconView:
            id: FileChoose
            pos_hint_x: 0.5
            pos_hint_y: 0.5
            on_selection: root.load(FileChoose.path, FileChoose.selection)
        MDRaisedButton:
            text: "Upload"
            text_color: (0,0,0,1)
            on_release: root.load(FileChoose.path, FileChoose.selection)
            on_release: popup.dismiss()

        MDRaisedButton:
            text: "Close"
            text_color: (0,0,0,1)
            on_release: popup.dismiss()


nav_layout:
    id: nav_layout
    MDNavigationDrawer:
        id: nav_drawer
        drawer_logo: 'logo.png'
        NavigationDrawerToolbar:
            title: 'hello'
        NavigationDrawerIconButton:
            icon: 'settings'
            text: 'Account Settings'
            on_release: root.change_screen('screen3')
        NavigationDrawerIconButton:
            icon: 'face'
            text: 'Friends'
            on_release: root.print_text()
        NavigationDrawerIconButton:
            icon: 'logout'
            text: 'Logout'
            on_release: root.logout()
        NavigationDrawerDivider:
            height: dp(1)
    MyLayout:
        scr_mngr: scr_mngr
        orientation: 'vertical'


        ScreenManager:

            transition: CardTransition()
            id: scr_mngr
            screen1: screen1

            Screen:
                id: screen1
                name: 'screen1'
                username: username
                password: password

                BoxLayout:
                    size_hint: None, None
                    size: dp(520), dp(340)
                    pos_hint: {'center_x': 0.5, 'center_y': 0.5}

                    BoxLayout:
                        orientation:'vertical'
                        padding: dp(20)
                        spacing:20

                        MDLabel:
                            text: 'Chat App'
                            theme_text_color: 'Secondary'
                            font_style:"Title"
                            size_hint_y: None
                            height: dp(36)

                        MDSeparator:
                            height: dp(1)

                        MDTextField:
                            id: username
                            hint_text: "Username "
                            size_hint_y: 0.9
                            helper_text_mode: "on_focus"

                        MDTextField:
                            id: password
                            hint_text: "Password "
                            helper_text_mode: "on_focus"
                            size_hint_y: 0.9
                            password: True

                        MDFlatButton:
                            text: "Login"
                            pos_hint: {'center_x': 0.5}
                            on_release: root.check_data_login()

                        MDLabel:
                            id: wrongpass
                            color: 1,0,1,1
                            text: ""



            Screen:
                name: 'screen2'
                id: screen2

                Toolbar:
                    id: toolbar
                    title: "Welcome ! "
                    pos_hint: {'center_x': 0.5, 'center_y': 0.96}
                    md_bg_color: app.theme_cls.primary_color
                    background_palette: 'DeepPurple'
                    background_hue: 'A400'
                    left_action_items: [['menu', lambda x: app.root.toggle_nav_drawer() ]]
                    right_action_items: [['animation', lambda x: MDThemePicker().open()], ['camera', lambda x: print('hello')]]

                MDLabel:
                    id: data
                    font_style: 'Title'
                    theme_text_color: 'Primary'
                    text: "Data :"
                    height: self.texture_size[1] + dp(3)
                    halign: 'center'
                    pos_hint: {'center_x': 0.5, 'center_y': 0.5}



            Screen:
                name: 'screen3'
                id: screen3

                Toolbar:
                    id: tools
                    title: "Your Profile"
                    pos_hint: {'center_x': 0.5, 'center_y': 0.96}
                    md_bg_color: app.theme_cls.primary_color
                    background_palette: 'DeepPurple'
                    background_hue: 'A400'
                    left_action_items: [['arrow-left', lambda x: root.back_to_chat()]]
                MDLabel:
                    id: Profile_String
                    font_size: 90
                    text: "XXX"
                    halign: 'center'
                    pos_hint: {'center_x': 0.5, 'center_y': 0.85}

            Screen:
                name: 'screen4'
                id: screen4

                Toolbar:
                    id: tools
                    title: "XXX"
                    pos_hint: {'center_x': 0.5, 'center_y': 0.96}
                    md_bg_color: app.theme_cls.primary_color
                    background_palette: 'DeepPurple'
                    background_hue: 'A400'
                    left_action_items: [['menu', lambda x: app.root.toggle_nav_drawer() ]]
                    right_action_items: [['animation', lambda x: MDThemePicker().open()], ['camera', lambda x: print('hello')]]
                ScrollView:
                    pos_hint: {'center_x': .55, 'y': .35}
                    MDLabel:
                        size_hint: 1, None
                        id: Chat_String
                        font_size: 40
                        text: "XXX"


                MDTextField:
                    id: Input_String
                    hint_text: 'Enter Your Message...'
                    helper_text_mode: 'on_focus'
                    pos_hint: {'center_x': 0.35, 'center_y': 0.2}
                    size_hint_x: 0.6
                    multiline: True


                MDRaisedButton:
                    id: Send_Button
                    text: 'Send'
                    pos_hint: {'center_x': 0.75, 'center_y': 0.2}

                MDRaisedButton:
                    id: Choose_Image
                    text: 'Attach File'
                    pos_hint: {'center_x': 0.9, 'center_y': 0.2}
                    on_release: Factory.UploadPopup().open()
"""


class MDCustomIconItem(OneLineAvatarListItem):
    icon = StringProperty('')
    text = StringProperty()

    def _set_active(self, active, list):
        pass


class AvatarSampleWidget(ILeftBody, Image):
    pass


class MyApp(App):
    theme_cls = ThemeManager()
    theme_cls.primary_palette = 'Blue'
    title = "Navigation Drawer"
    main_widget = None
    def __getattr__(self, attr):
        return super().__getattr__(attr)
    def build(self):
        self.main_widget = Builder.load_string(KV)
        return self.main_widget

    def callback(self, instance, value):
        self.main_widget.ids.scr_mngr.current = 'screen4'


    def on_start(self):
        for i in range(15):
            self.main_widget.ids.nav_drawer.add_widget(
                MDCustomIconItem(
                    text="Item menu %d" % i,
                    icon='logo.png',
                    on_release=lambda x, y=i: self.callback(x, y)))


MyApp().run()

Tags: textfromimportselfididsdataon
1条回答
网友
1楼 · 发布于 2024-09-24 22:30:20

您需要设置滚动视图的大小。添加size_hint: (0.85, 0.55)

片段

            ScrollView:
                size_hint: (0.85, 0.55)
                pos_hint: {'center_x': .55, 'y': .35}

                MDLabel:
                    id: Chat_String
                    font_size: 40

输出

Result

相关问题 更多 >