#python #kivy
#python #kivy
Вопрос:
Я написал сервис на python, используя библиотеку OSC, вот мой код:
def __init__(self, * * kwargs):
super(ElectronApp, self).__init__( * * kwargs)
self.electronController = ElectronController()
self.button = ElectronTHView()
def build(self):
return Builder.load_file('ElectronApp.kv')
def build(self):
self.button = ElectronTHView()
self.service = None
self.start_service()
osc.init()
oscid = osc.listen(port = 3002)
osc.bind(oscid, self.display_message, '/message')
osc.bind(oscid, self.date, '/date')
Clock.schedule_interval(lambda * x: osc.readQueue(oscid), 0)
self.root = Builder.load_file('ElectronApp.kv')
return self.root
....
def date(self, message, * args):
print(message[2])
# here i get message from my service and i want to update text on button
self.button.ids.tem.text = message[2]
class ElectronAppMain(BoxLayout):
pass
class ElectronAppMainView(TabbedPanel):
pass
class ElectronAppBottomBar(BoxLayout):
pass
class ElectronButton(Button):
pass
class ElectronTHView(BoxLayout):
pass
*.KV код файла:
ElectronAppMain:
<ElectronAppMain>:
padding: "-2dp"
orientation: "vertical"
canvas.before:
Rectangle:
size: self.size
pos: self.pos
source: "background.png"
ElectronAppMainView:
ElectronAppBottomBar:
<ElectronAppBottomBar>:
size_hint: 1, None
height: "50dp"
padding: "0dp"
orientation: "horizontal"
spacing: "0dp"
ElectronButton:
text: "STOP"
size_hint: 1, None
height: "50dp"
on_release:
ElectronButton:
text: "EXIT"
size_hint: 1, None
height: "50dp"
on_release:
<ElectronAppMainView>:
tab_pos: "top_left"
do_default_tab: False
tab_height: "50dp"
tab_width: root.width/3
background_image:
font_size: "12dp"
background_normal:
background_down:
text: "T/H"
font_name: "fonts/Roboto-Medium.ttf"
ElectronTHView:
TabbedPanelItem:
font_size: "12dp"
background_normal:
background_down:
text: "CUSTOM"
font_name: "fonts/Roboto-Medium.ttf"
TabbedPanelItem:
font_size: "12dp"
background_normal:
background_down:
text: "PATTERN"
font_name: "fonts/Roboto-Medium.ttf"
<ElectronTHView>:
orientation: "vertical"
spacing: "5dp"
padding: "10dp"
ElectronButton:
id: temp
background_normal: ....
background_down:
size_hint: 1, .5
height: self.height
text: "Temperature"
on_release:
ElectronButton:
background_normal:
background_down:
size_hint: 1, .5
height: self.height
text: "Humidity"
on_release:
Я пробовал другие варианты, но ничего… когда я пытаюсь обновить текст в
def date(self, message, *args):
print(message[2])
#here i get message from my service and i want to update text on button
self.button.ids.tem.text = message[2]
я получаю такую ошибку:
Sat Oct 22 16:35:27 2016
OSC callback /date caused an error: 'super' object has no attribute '__getattr__'
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/kivy/lib/osc/OSC.py", line 288, in dispatch
callbackfunction(message, source)
File "main.py", line 128, in date
self.button.ids.temp.text = '1'
File "kivy/properties.pyx", line 757, in kivy.properties.ObservableDict.__getattr__ (kivy/properties.c:11882)
AttributeError: 'super' object has no attribute '__getattr__'
---------------------
[INFO ] [Base ] Leaving application in progress...
[ERROR ] [OSC ] Error in Tuio recv()
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/kivy/lib/osc/oscAPI.py", line 229, in run
message = self.socket.recv(65535)
error: [Errno 4] Interrupted system call
Я новичок в kivy…Заранее спасибо за помощь!
Комментарии:
1. Пожалуйста, потрудитесь правильно отформатировать свой вопрос. Сейчас это невозможно прочитать
2. Привет! я сделал это!
3. Так намного лучше. Если вы можете процитировать трассировку стека из python (полный текст ошибки), если таковой имеется, кому-то будет намного проще помочь вам.
4. Просто предположение, попробуйте
self.button.ids['temp'].text = message[2]
.5. @agg3l скопирован с терминала.
Ответ №1:
Вы пытаетесь обновить текст виджетов «Электронная кнопка» с помощью вашей функции date (self, message, * args) через событие «on_release»? Даже если дело не в этом, этот пример, тем не менее, может вам помочь:
Во-первых, вы должны поместить date () в нужное место, чтобы его можно было правильно вызвать из файла .kv. Например:
class ElectronAppBottomBar(BoxLayout):
def date(self, widget, message, *args):
widget.text = message[2]
И с этого момента в файле .kv:
<ElectronAppBottomBar>:
size_hint: 1, None
height: "50dp"
padding: "0dp"
orientation: "horizontal"
spacing: "0dp"
ElectronButton:
text: "STOP"
size_hint: 1, None
height: "50dp"
on_release:root.date(self,message) #or app.date(self,message) if date is definded at the App level
Это всего лишь пример. Когда дело доходит до:
self.button.ids.tem.text = message[2]
В зависимости от того, в каком классе вы находитесь, таких вещей, как self.ids.tem.text = message[2] или self.parent.ids.tem.text = message [2] может быть достаточно, чтобы получить то, что вы хотите. Проверьте в официальной документации, как вы можете перемещаться по дереву виджетов. Надеюсь, это поможет.
Ответ №2:
Сначала всем привет и извините, что я забыл поделиться решением моей проблемы! Это было очень просто — но я был в недоумении и не сразу понял все, что я делаю — я просто переписал файл *.kv в таком режиме:
ElectronAppMain:
<ElectronAppMain>:
padding: "-2dp"
orientation: "vertical"
canvas.before:
Rectangle:
size: self.size
pos: self.pos
source: "background.png"
ElectronMainView:
tab_pos: "top_left"
do_default_tab: False
tab_height: "50dp"
tab_width: root.width/3
TabbedPanelItem:
font_size: "12dp"
text: "T/U"
font_name: "fonts/Roboto-Medium.ttf"
ElectronTHView:
orientation: "vertical"
spacing: "5dp"
padding: "5dp"
ElectronLabel:
id: date
color: 0,0,0,0.54
halign: "center"
font_size: "16dp"
size_hint: 1, 1
height: self.texture_size[1]
text_size: self.width, None
font_name: "fonts/Roboto-Regular.ttf"
ElectronButton:
id: test
on_press: app.send()
TabbedPanelItem:
font_size: "12dp"
text: "CUSTOM"
font_name: "fonts/Roboto-Medium.ttf"
TabbedPanelItem:
font_size: "12dp"
text: "PATTERN"
font_name: "fonts/Roboto-Medium.ttf"
Еще раз спасибо всем!