Sono nuovo di zecca per Kivy, e anche nuovo per la GUI, ma non nuovo per la programmazione.Kivy - thread, code, orologi e prese Python
Mi manca completamente la barca, la canoa e l'aereo usando Kivy.
In 30 anni di programmazione, da codice macchina, assembly, Fortran, C, C++, Java, Python, non ho mai provato a utilizzare un linguaggio come Kivy la cui documentazione è così sottile, perché è così nuova. So che andrà meglio, ma sto cercando di usarlo ora.
Nel mio codice, sto cercando di implementare l'accodamento, in modo da poter ottenere i dati del socket Python. Nella normale programmazione di Python, avrei IPC tramite una coda: inserire i dati, ottenere i dati.
Ho capito da Kivy, per lo più da quello che ho letto in vari forum, ma non posso dire che ho trovato nella documentazione in kivy.org, che non posso effettuare le seguenti operazioni:
- Kivy deve essere nella sua stessa discussione.
- Nulla in Kivy dovrebbe dormire.
- Nulla in Kivy dovrebbe bloccare l'IO.
Dopo un sacco di ricerche Google, l'unica cosa che ho trovato che si avvicina di essere utile, è un informative note here on StackOverFlow. Tuttavia, mentre risolve quasi il mio problema, la risposta presuppone che conosco più cose su Kivy di me; Non so come incorporare la risposta.
Se qualcuno potesse dedicare del tempo a mettere insieme una breve demo COMPLETA di utilizzo di quell'esempio, o una delle vostre uniche risposte COMPLETE, lo apprezzerei molto!
Ecco un codice breve che ho messo insieme, ma non funziona, perché blocca sulla chiamata get().
from Queue import Queue
from kivy.lang import Builder
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty
from kivy.clock import Clock
from threading import Thread
class ClockedQueue(BoxLayout):
text1 = StringProperty("Start")
def __init__(self):
super(ClockedQueue,self).__init__()
self.q = Queue()
self.i=0
Clock.schedule_interval(self.get, 2)
def get(self,dt):
print("get entry")
val = self.q.get()
print(self.i + val)
self.i += 1
class ClockedQueueApp(App):
def build(self):
return ClockedQueue()
class SourceQueue(Queue):
def __init__(self):
q = Queue()
for word in ['First','Second']:
q.put(word)
print("SourceQueue finished.")
def main():
th = Thread(target=SourceQueue)
th.start()
ClockedQueueApp().run()
return 0
if __name__ == '__main__':
main()
Grazie!
Non stai avendo un problema con Kivy qui, hai un problema con tutto il resto nel tuo codice. 'SourceQueue' non fa nulla, in quanto crea solo una variabile locale temporanea. Inoltre, non fa mai riferimento a nient'altro nel tuo codice. Non ha bisogno di essere in una discussione, e sicuramente non dovrebbe essere il 'target' di una discussione. Per quanto riguarda il blocco di 'get', è semplice come usare 'get_nowait' e prendere' Queue.Empty'. –