【问题标题】:Change TextInput to display only function for Kivy Python将 TextInput 更改为仅显示 Kivy Python 的函数
【发布时间】:2021-06-02 10:02:48
【问题描述】:

我对 kivy 还是新手,对 Python 还是比较陌生。 我有主py。我计划让WindowGUI 从 main.py 获取一些输入并将它们显示在其文本框中。 这是我所拥有的:

from os import curdir
from posixpath import dirname
import kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout  # one of many layout structures
from kivy.uix.textinput import TextInput  # allow for ...text input.
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.core.window import Window
from kivy.uix.spinner import Spinner
from kivy.uix.dropdown import DropDown
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.properties import ObjectProperty
kivy.require('2.0.0')

class MainGUI(Screen):
    encoder = ObjectProperty()
    mileage = ObjectProperty()
    voltage = ObjectProperty()
    power = ObjectProperty()
    camera = ObjectProperty()
    engaged = ObjectProperty()
    idle = ObjectProperty()
    log = ObjectProperty()
    clear = ObjectProperty()
    status = ObjectProperty(None)

    def __init__(self, saySomething): 
        super().__init__() #Go up to __init__ of App
        self.saySomething = saySomething
    
    def power_option(self):
        self.power.text = "Power"
    
    def print_status(self):
        self.ids.Status_screen.text = self.saySomething
        return self.ids.Status_screen.text

class CameraGUI(Screen):
    def __init__(self, **kwargs): #kwargs is just a variable. it could be "banana" or "apple"
        super().__init__() #Go up to __init__ of App

class GUIManager(ScreenManager):
    pass

kv = Builder.load_file('newWindow.kv')

class WindowGUI(App):
    def __init__(self):
        super().__init__()
        # self.say = say
        print("TRY ME!!!!")
        
    
    def build(self):
        self.title = 'IamHero'
        return kv
    
if __name__ == '__main__':
   myWindowGUI = WindowGUI()
   myMainGUI = MainGUI('I am hero!')
   myWindowGUI.run()

###########################_newWindow.kv_#############################

GUIManager:
    MainGUI:
    CameraGUI:

<MainGUI>:
    name: "main"

    status: Status_screen
    GridLayout:
        cols: 2
        size: root.width, root.height #covers entire window
        padding: 15
        
        GridLayout:
            cols:1
            spacing: 10
            GridLayout:
                cols:2
                size_hint: .25,.1  
                Label:
                    id: Engaged
                    text: "Engaged"   
                Label:
                    id: Idle
                    text: "Idle"
            TextInput:
                # size_hint: 1
                id: Status_screen
                multiline: True
                readonly: True
                background_color: .6, .7, 0, 1
                text: root.print_status()
                #on_text: root.print_status()
               
            GridLayout:
                cols:2
                size_hint: .25,.1  
                Button:
                    id: Log
                    text: "Log status"
                    # size_hint_x: .5
                Button:
                    id: Clear
                    text: "Clear"

但是,我收到以下错误:

 Traceback (most recent call last):
   File "c:/Users/Jojo/#RaspberryPi4/Test/WindowGUI.py", line 57, in <module>
     kv = Builder.load_file('newWindow.kv')
   File "C:\Users\Jojo\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 306, in load_file
     return self.load_string(data, **kwargs)
   File "C:\Users\Jojo\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 408, in load_string
     self._apply_rule(
   File "C:\Users\Jojo\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 659, in _apply_rule
     child = cls(__no_builder=True)
 TypeError: __init__() got an unexpected keyword argument '__no_builder'

关于我做错了什么有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    您不能在您打算在kv 中使用的类的__init__() 中要求位置参数。你的__init__()MainGUI

    def __init__(self, saySomething):
    

    需要saySomething 的参数。一个简单的解决方法是将saySomething 变成StringPropertyMainGUI。那么你甚至不需要实现__init__()

    class MainGUI(Screen):
        encoder = ObjectProperty()
        mileage = ObjectProperty()
        voltage = ObjectProperty()
        power = ObjectProperty()
        camera = ObjectProperty()
        engaged = ObjectProperty()
        idle = ObjectProperty()
        log = ObjectProperty()
        clear = ObjectProperty()
        status = ObjectProperty(None)
        saySomething = StringProperty('Hi')
    
        # def __init__(self, saySomething):
        #     super().__init__() #Go up to __init__ of App
        #     self.saySomething = saySomething
    

    然后您可以像设置kv 中的任何其他属性一样设置saySomething 的值:

    <MainGUI>:
        name: "main"
    
        status: Status_screen
        saySomething: 'I am hero!'
    

    或者在python中你可以这样做:

    MainGUI(saySomething='I am hero!')
    

    还有一行:

    myMainGUI = MainGUI('I am hero!')
    

    (将不再起作用)正在创建一个未使用的 MainGUI 实例。这样就可以删除那行代码了。

    【讨论】:

    • 我有我的 main.py,它将把变量传递给MainGUI。您的解决方案似乎不允许我实现这一目标......或者我在这里遗漏了什么?如果我想向它传递任何东西,我仍然需要创建一个类的实例吗?
    • Builder.load_file('newWindow.kv') 创建您在App 中看到的MainGUI 实例。如果您创建 MainGUI 的另一个实例,它将与您的 GUI 中出现的实例没有任何关联。因此,您需要获取对现有实例的引用,例如:mainGUI = self.root.get_screen('main')(如果在 App 方法中运行)。然后你可以做mainGUI.saySomething = 'Abba Dabba Doo'
    • 好的。所以我将MainGUI = self.root.get_screen('main')MainGUI.saySomething = 'Abba Dabba Doo' 放入class WindowGUI(App)def __init__(self): 中,并将saySomething = StringProperty() 放入MainGUI 中。那我该怎么办def print_status(self):?我在 kv 文件中有text: root.print_status()
    • 可以去掉print_status()方法,把text: root.saySomething放到kv中。另外,设置MainGUI = anything 是个坏主意,因为MainGUI 是一个类。保持你的类名和变量名分开。
    • 酷。我在WindowGUI(App) 类的def __init__(self): 中将MainGUI 更正为mainGUI。现在我得到了这个错误:AttributeError: 'NoneType' object has no attribute 'get_screen' 指的是mainGUI = self.root.get_screen('main')
    猜你喜欢
    • 2018-05-13
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2020-06-15
    • 2021-07-16
    • 1970-01-01
    相关资源
    最近更新 更多