Python 3.x ObjectProperty没有属性(Kivy、Python3.x)

Python 3.x ObjectProperty没有属性(Kivy、Python3.x),python-3.x,kivy,kivy-language,Python 3.x,Kivy,Kivy Language,这个问题经常被问到和回答,但我仍然无法让它发挥作用。我想访问另一个小部件的子部件。为此,我使用了ObjectProperty。当我尝试访问ObjectProperty(通过FileChooser弹出窗口打开任何文件)以更改标签文本时,我会遇到以下错误: self.pdfpages.text=“更改为此”属性错误: “kivy.properties.ObjectProperty”对象没有属性“text” 我需要初始化ObjectProperty吗?还是我的.kv结构有问题 main.py impo

这个问题经常被问到和回答,但我仍然无法让它发挥作用。我想访问另一个小部件的子部件。为此,我使用了ObjectProperty。当我尝试访问ObjectProperty(通过FileChooser弹出窗口打开任何文件)以更改标签文本时,我会遇到以下错误:

self.pdfpages.text=“更改为此”属性错误: “kivy.properties.ObjectProperty”对象没有属性“text”

我需要初始化ObjectProperty吗?还是我的.kv结构有问题

main.py

import kivy
kivy.require('1.10.0') # replace with your current kivy version !
# Kivy Imports
from kivy.app import App
#UI Eleemnts
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.popup import Popup
from kivy.uix.scrollview import ScrollView
from kivy.uix.scatter import Scatter
from kivy.uix.image import Image

#Core Elements
from kivy.core.image import Image as CoreImage
from kivy.properties import ObjectProperty

# Python Imports
import os

class Window(BoxLayout):
    #add child widgets (in kv file)
    pass


class PDFView(ScrollView):
    pdfpages = ObjectProperty()

    def newPage(self, filepath):
         #here the error occurs   
         self.pdfpages.text = "change to this"

class SideBar(BoxLayout):
    def openfile(self):
        print("Button pressed")
        OpenDialog().open()

class OpenDialog(Popup):
    def cancelfile(self):
        #close popup
        self.dismiss()
        print("No file opened")

    def openfile(self, path, selection):
        #selection can contain multiple files, [0] is first or only
        self.dismiss()
        print("Opened File: " + os.path.join(path, selection[0]))
        #open PDFView class
        PDFView.newPage(PDFView, os.path.join(path, selection[0]))        


class PDFEditor(App):
    title = "PDFEditor"
    #gets called on startup
    #load program
    def build(self):
        #return root node
        return Window()

if __name__ == '__main__':
    PDFEditor().run()
PDFEditor.kv

<Window>:
    #this is the main (root) "window"
    orientation: "horizontal"
    SideBar:
        size_hint: (.1, 1)
    PDFView:
        size_hint: (.9, 1)

<PDFView>:
    #handler for ObjectProperty
    pdfpages: pdfpages
    Scatter:
    #only zoom
        BoxLayout:
            #add Images in here somehow
            orientation: "vertical"
            Label:
                id: pdfpages
                text: "hi"


<SideBar>:
    orientation: "vertical"
    Button:
        id: btn_openfile
        on_release: root.openfile()
        text: "Open File"
    Label:
        text: "Hello!"

<OpenDialog>:
    title: "Choose File"
    BoxLayout:
        #Fullscreen
        size: root.size
        pos: root.pos
        orientation: "vertical"
        FileChooserListView:
            id: chsr_open
        BoxLayout:
            size_hint_y: None
            height: 30
            Button:
                text: "Cancel"
                on_release: root.cancelfile()
            Button:
                text: "Open"
                on_release: root.openfile(chsr_open.path, chsr_open.selection)
:
#这是主(根)“窗口”
方向:“水平”
侧栏:
大小提示:(.1,1)
PDFView:
尺寸提示:(.9,1)
:
#ObjectProperty的处理程序
pdfpages:pdfpages
散布:
#仅缩放
盒子布局:
#在这里添加图片
方向:“垂直”
标签:
id:pdfpages
文字:“嗨”
:
方向:“垂直”
按钮:
id:btn_openfile
发布时:root.openfile()
文本:“打开文件”
标签:
文字:“你好!”
:
标题:“选择文件”
盒子布局:
#全屏
大小:root.size
pos:root.pos
方向:“垂直”
文件选择器列表视图:
id:chsr_开放
盒子布局:
尺寸提示:无
身高:30
按钮:
文本:“取消”
发布时:root.cancelfile()
按钮:
正文:“打开”
发布时:root.openfile(chsr\u open.path,chsr\u open.selection)

将您的
openfile
方法更改为:

def openfile(self, path, selection):
    #selection can contain multiple files, [0] is first or only
    self.dismiss()
    print("Opened File: " + os.path.join(path, selection[0]))
    #open PDFView class
    PDFView().newPage(PDFView, os.path.join(path, selection[0]))
PDFView
是类,
PDFView()
是这个类的一个实例,您需要什么

编辑

标签不会更改,因为您正在创建一个新标签,而没有替换它。所以,如果我理解的很好,你想要的就是替换你的PDFView的文本。有很多方法可以做到这一点,但我不想编辑太多您的代码:尝试以下方法:

...
class OpenDialog(Popup):
    ...
    def openfile(self, path, selection):
        #selection can contain multiple files, [0] is first or only
        self.dismiss()
        print("Opened File: " + os.path.join(path, selection[0]))
        #open PDFView class
        app.window.ids.pdfview.newPage(PDFView, os.path.join(path, selection[0]))
    ...
...

class PDFEditor(App):
    ...
    def build(self):
        #return root node
        self.window = Window()
        return self.window

app = PDFEditor()

if __name__ == '__main__':
    app.run()
在您的kv中:

...
<Window>:
    #this is the main (root) "window"
    orientation: "horizontal"
    SideBar:
        size_hint: (.1, 1)
    PDFView:
        id: pdfview
        size_hint: (.9, 1)
...
。。。
:
#这是主(根)“窗口”
方向:“水平”
侧栏:
大小提示:(.1,1)
PDFView:
id:pdfview
尺寸提示:(.9,1)
...

这里的问题是,您设置了一个新实例的文本,该实例甚至不在窗口中,而不是您所有的实例。
要解决此问题,您需要访问您拥有的

首先,将您的
窗口
设置为
应用程序
属性,以便以后可以引用它

class PDFEditor(App):
    title = "PDFEditor"
    def build(self):
        self.root = Window()
        return self.root
然后给出
PDFView
一个
id
,单位为kv

<Window>:
    orientation: "horizontal"
    SideBar:
        size_hint: (.1, 1)
    PDFView:
        id: pdfview
        size_hint: (.9, 1)

这样您就可以访问
窗口的
ID

谢谢。这不会引发错误,但文本不会更改。我发现您的答案与@EL3PHANTEN给出的答案非常相似。这两种方法都很好:)只是想知道:与构建方法中的self.root相比,什么时候会选择self.window?@Spreng0r root或window只是您选择的名称。。我只是把它看作应用程序的根。也可能是窗口或垃圾邮件,这样我可以访问其他类的成员。谢谢
def openfile(self, path, selection):
    self.dismiss()
    print("Opened File: " + os.path.join(path, selection[0]))
    app = App.get_running_app()
    pdf = app.root.ids.pdfview
    pdf.newPage(os.path.join(path, selection[0]))