Пытаюсь понять киви.
Работа над простым приложением, включающим несколько экранов. В настоящее время я пытаюсь вызвать всплывающее окно с помощью кнопки on_release в … безуспешно. Ошибка:
Traceback (most recent call last):
File "C:\Users\thoma\PycharmProjects\FacesApp\venv\lib\site-packages\kivy\lang\builder.py", line 725, in _apply_rule
raise AttributeError(key)
AttributeError: release
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:/Users/thoma/PycharmProjects/FacesGUI/main.py", line 36, in <module>
kv = Builder.load_file("my.kv")
File "C:\Users\thoma\PycharmProjects\FacesApp\venv\lib\site-packages\kivy\lang\builder.py", line 301, in load_file
return self.load_string(data, **kwargs)
File "C:\Users\thoma\PycharmProjects\FacesApp\venv\lib\site-packages\kivy\lang\builder.py", line 405, in load_string
rule_children=rule_children)
File "C:\Users\thoma\PycharmProjects\FacesApp\venv\lib\site-packages\kivy\lang\builder.py", line 657, in _apply_rule
root=rctx['ids']['root'], rule_children=rule_children)
File "C:\Users\thoma\PycharmProjects\FacesApp\venv\lib\site-packages\kivy\uix\widget.py", line 469, in apply_class_lang_rules
rule_children=rule_children)
File "C:\Users\thoma\PycharmProjects\FacesApp\venv\lib\site-packages\kivy\lang\builder.py", line 538, in apply
rule_children=rule_children)
File "C:\Users\thoma\PycharmProjects\FacesApp\venv\lib\site-packages\kivy\lang\builder.py", line 734, in _apply_rule
'{}: {}'.format(e.__class__.__name__, e), cause=tb)
kivy.lang.builder.BuilderException: Parser: File "C:\Users\thoma\PycharmProjects\FacesGUI\my.kv", line 100:
...
98: center_x: self.parent.center_x
99: center_y: self.parent.center_y
>> 100: on_release: root.show_popup()
101:
102:
...
AttributeError: release
File "C:\Users\thoma\PycharmProjects\FacesApp\venv\lib\site-packages\kivy\lang\builder.py", line 725, in _apply_rule
raise AttributeError(key)
Я попытался вызвать с использованием root, app, self, создать экземпляр MyMainApp () и передать его. ????????
Я заметил, что некоторые пользователи рекомендуют использовать строки компоновщика в .py, в то время как другие предлагают использовать файл .kv для макета и т.д.
Какие преимущества или недостатки у одного или другого .. ?? Хотя я привык к макетам xml и классам java / kotlin для логики, использование .kv было немного … запутанным.
my.kv
<P>:
Label:
text: "Eneter Name or Type 'skip':"
TextInput:
text: ""
Button:
text: "Submit"
WindowManager:
MainWindow:
SecondWindow:
<MainWindow>:
name: "main"
GridLayout:
cols:2
Button:
text:"Live Camera"
on_press: root.activatecamera()
Button:
text:"SD Card"
on_press: root.sdcard()
Button:
text:"Event Images"
on_press: root.viewEventImages()
Button:
text:"Event Faces"
on_release:
app.root.current = "eventfaces"
root.manager.transition.direction = "left"
Button:
text:"List Names"
on_press: root.listknownfaces()
Button:
text:"View Log"
on_press: root.pipeout()
Button:
text:"Scan Directory"
on_press: root.scanDirectory()
Button:
text:"Facial Recognition on Image"
on_press: root.metadataRead()
Button:
text:"Label Image"
on_press: root.metadataRead()
Button:
text:"Blur Faces"
on_press: root.metadataRead()
Button:
text: "Metadata"
on_release:
app.root.current = "second" if passw.text == "tim" else "main"
root.manager.transition.direction = "left"
Button:
text: "Misc."
on_release:
app.root.current = "second" if passw.text == "tim" else "main"
root.manager.transition.direction = "left"
<SecondWindow>:
name: "eventfaces"
GridLayout:
cols:1
rows:2
GridLayout:
cols:4
Button:
id: myButton
Image:
source: "unnamed/unnamed1.jpg"
center_x: self.parent.center_x
center_y: self.parent.center_y
on_release: root.show_popup()
Button:
id: myButton
Image:
source: "unnamed/unnamed2.jpg"
center_x: self.parent.center_x
center_y: self.parent.center_y
Button:
id: myButton
Image:
source: "unnamed/unnamed3.jpg"
center_x: self.parent.center_x
center_y: self.parent.center_y
Button:
id: myButton
Image:
source: "unnamed/unnamed4.jpg"
center_x: self.parent.center_x
center_y: self.parent.center_y
Button:
id: myButton
Image:
source: "unnamed/unnamed5.jpg"
center_x: self.parent.center_x
center_y: self.parent.center_y
Button:
id: myButton
Image:
source: "unnamed/unnamed6.jpg"
center_x: self.parent.center_x
center_y: self.parent.center_y
Button:
id: myButton
Image:
source: "unnamed/unnamed7.jpg"
center_x: self.parent.center_x
center_y: self.parent.center_y
Button:
id: myButton
Image:
source: "unnamed/unnamed8.jpg"
center_x: self.parent.center_x
center_y: self.parent.center_y
Button:
id: myButton
Image:
source: "unnamed/unnamed9.jpg"
center_x: self.parent.center_x
center_y: self.parent.center_y
Button:
id: myButton
Image:
source: "unnamed/unnamed10.jpg"
center_x: self.parent.center_x
center_y: self.parent.center_y
Button:
id: myButton
Image:
source: "unnamed/unnamed11.jpg"
center_x: self.parent.center_x
center_y: self.parent.center_y
Button:
text: "Main Menu"
on_release:
app.root.current = "main"
root.manager.transition.direction = "left"
main.py
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.popup import Popup
class P(BoxLayout):
pass
class MainWindow(Screen):
pass
class SecondWindow(Screen):
pass
class WindowManager(ScreenManager):
pass
def show_popup():
show = P() # Create a new instance of the P class
popupWindow = Popup(title="Enter Name or Type 'skip': ", content=show, size_hint=(None, None), size=(400, 400))
# Create the popup window
popupWindow.open() # show the popup
kv = Builder.load_file("my.kv")
class MyMainApp(App):
def build(self):
return kv
if __name__ == "__main__":
MyMainApp().run()
Если кто-то может подсказать мне, следует ли мне использовать процесс строк Builder или .kv и / или как я могу создать всплывающее окно с меткой, вводом текста и кнопкой и вызовом с кнопки в нем, будет очень признателен.
Я считаю, что в моем файле .py есть ошибка, касающаяся структуры. Я попытался переместить def show_popup () в класс SecondWindow, как я видел в примере, но безуспешно.
Нужно ли назначать def (я) каждому окну? или их можно вызвать из-за пределов оконного класса?
Заранее спасибо. Я знаю, что это длинный пост для простой задачи. : /
код запускается, если on_release: root.show_popup () закомментирован — person ThomasLYIT schedule 20.07.2020
Параметр
on_release:
не поддерживается дляImage
. Вам нужно переместить его вButton
:Также обратите внимание, что
id
может ссылаться только на одинWidget
, поэтомуmyButton
id
будет ссылаться только на последнийButton
с этимid
.Спасибо! Когда я читаю ваш пост, это кажется очевидным …:? Спасибо еще раз. — person ThomasLYIT; 20.07.2020
Любая идея, почему всплывающий контент будет отображаться дважды … т.е. 2 текстовых ввода и 2 кнопки? только по одному экземпляру каждого из них в .kv — person ThomasLYIT; 20.07.2020