未能使用python在.kv文件的输出屏幕中动态添加小部件



我试图将结果添加到内容应该是动态的新屏幕中。我尝试了StackOverflow中给出的一些琐碎的方法,但没有显示任何内容。我的代码就是这样。

我正在输入用"没有空格,使用文本输入,然后将其拆分,将其存储为列表。数据将被解析,输出屏幕上应该显示相同数量的标签,我尝试过,但没有成功执行(anbs.py中的第51-56行(

例如,输入是"0";I、 我是个好孩子
结果应该是控制台中的结果,即每个标签的文本应该包含一个单独的项目,但没有任何内容进入输出屏幕。。。只是一个用来在屏幕之间移动的大按钮。

这是我的anbs.py文件。

from kivy.app import App
from kivy.lang.builder import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.popup import Popup
from kivy.uix.label import Label
from kivy.properties import ObjectProperty
from kivy.core.window import Window
from kivy.factory import Factory
Window.size = (600, 600)
class HelpWindow(Screen):
"""
This is a help window. It contains the functionality of all the given boxes
on the main window.
"""
def main_window(self):
sm.current = "main"
class MainWindow(Screen):
"""
This is the main window that contains the main form.
This connects the frontend of the app to the backend
"""
target = ObjectProperty(None)

def v_popup(self):
version_popup()

def help(self):
sm.current = "help"

def output_window(self):
sm.current = "output"
def get_results(self):
#OutputWindow.main(options = options)
out_window = OutputWindow()
out_window.main(self.target.text)
sm.current = "output"

class OutputWindow(Screen):
"""
This is the output window. All the generated results will be seen here.
"""
res = ObjectProperty(None)
res_out = ObjectProperty(None)
def main(self, options):
options = list(options.split(","))
for item in options:
print(item)
self.res_out.add_widget(Label(text=item))

def main_window(self):
sm.current = "main"
class WindowManager(ScreenManager):
pass
def version_popup():
"""
Version Popup Window.
"""

version = "v1.0"
version_text = "this is "+version+" for this app"
vpop = Popup(title="Version",
content=Label(text=version_text),
size_hint=(None, None), size=(400, 400))

vpop.open()
### main builder and WindowManager object
kv = Builder.load_file("start.kv")
sm = WindowManager()
### Adding screens to widget
screens = [MainWindow(name="main"), HelpWindow(name="help"), OutputWindow(name="output")]
for screen in screens:
sm.add_widget(screen)
sm.current = "main"
### main working
class AnbsApp(App):
def build(self):
return sm

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

我的start.kv文件看起来像这个

<HelpWindow>
name:"help"
Button:
id:ms
text:"Main Screen"
on_release:
root.manager.transition.direction = "left"
root.main_window()
<MainWindow>
name:"main"
target : target


GridLayout:
cols:1
GridLayout:
cols:3

row_force_default: True
row_default_height: 50

Button:
id:hp
text:"Help"
on_release:
root.manager.transition.direction = "right"
root.help()

Button:
id:version
text: "Version"
on_release: 
root.v_popup()

GridLayout:
cols:2
row_force_default: True
row_default_height: 30
Label:
text:"Target *"
TextInput:
id:target
multiline:False


GridLayout:
cols:3
row_force_default: True
row_default_height: 50
Label:
text:""

Button:
text:"Submit"
on_release:
root.get_results()

Label:
text:""

<OutputWindow>
name:"output"

res_out:res_out
GridLayout:
id:res_out
cols : 1


Button:
id:ms
text:"Main Screen"
on_release:
root.manager.transition.direction = "right"
root.main_window()

我真的说不出我遗漏了什么要点。

您的代码:

def get_results(self):
#OutputWindow.main(options = options)
out_window = OutputWindow()
out_window.main(self.target.text)
sm.current = "output"

正在以下行中创建OutputWindow的新实例:

out_window = OutputWindow()

然后调用该新实例的CCD_ 2方法。但是,该新实例不在GUI中,因此没有观察到任何影响。要更正此问题,请更改代码以使用GUI中的OutputWindow实例:

def get_results(self):
out_window = self.manager.get_screen('output')  # get OutputWindow instance
out_window.main(self.target.text)
sm.current = "output"

您还需要调整ButtonOutputWindow中的大小/位置,使其不会完全覆盖GridLayout

最新更新