2017-12-04 7 views
0

Ich versuche, ein Bild auf einer Zeichenfläche zu platzieren, die jede Sekunde automatisch aktualisiert wird. Die Zeichenfläche enthält eine bestimmte Quelle für ein Bild. Wenn die Bilddatei ersetzt wird, wird sie aktualisiert und auf der Benutzeroberfläche neu geladen. Keine Benutzereingabe und kein Beenden der GUI erforderlich.Kivy: Wie Leinwand in einem bestimmten Layout platziert

Ich konnte das Bild neu laden, aber jetzt kann ich das Bild nicht platzieren, wo ich möchte. Ich möchte in der Lage, es in einem Layout zu platzieren, vorzugsweise an der oberen rechten Ecke des Bildschirms

Meine folgende Haupt-Python-Datei als

import kivy 
import os 

kivy.require('1.10.0') 

from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.uix.image import Image 
from kivy.properties import StringProperty 
from kivy.clock import Clock 
from kivy.uix.anchorlayout import AnchorLayout 
from kivy.uix.widget import Widget 
from kivy.graphics.instructions import InstructionGroup 
from sshtest import ssh #import the ssh class from the ssh python file 


class ScreenOne(Screen): 
    def login(self): #define login using ssh as a function 

     #Make a Class Variable called connection. This allows for other 
     #classes to call on it without passing it as an argument 

     ScreenOne.connection = ssh("192.168.1.3", "pi", "seniordesign") 
       #ScreenOne.connection.sendCommand("ls") 
     #ScreenOne.connection.sendCommand("mkdir thisistest") 
     print("Logging in") #For error checking 

    def gpioSet(self): #allows for gpio pins to trigger image capture 
     ScreenOne.connection.sendCommand("echo '18' > /sys/class/gpio/export") 
     ScreenOne.connection.sendCommand("echo 'out' > /sys/class/gpio/gpio18/direction") 

class ScreenTwo(Screen): #This is where all the functions are 

    def command(self, input): #create a function that sends command through ssh 
     ScreenOne.connection.sendCommand(input) #Call on connection made before to send command 




class MyScreenManager(ScreenManager): 
    pass 

class MyPicture(Widget): 

    def __init__(self,**kwargs): 
     super(MyPicture,self).__init__(**kwargs) 
     with self.canvas: 
      MyPicture.picture = Image(source = 'C:/Users/Jason/Desktop/RaspberryPiTransferred/TEST.jpg', 
             size_hint=(.3,.3)) 


      #self.add_widget(Image(MyPicture.picture)) 

    def update(self): 
     MyPicture.picture.reload() 

    Clock.schedule_interval(update,1) 



#Create the Application that will change screens. Add App(App) to end of wanted classname 
class ScreenChangeApp(App): 

#Create a function that builds the app. Keyword self make sures to reference 
#current instantiation 

    def build(self): 
     screen_manager = ScreenManager() 

     screen_manager.add_widget(ScreenOne(name = "screen_one")) 
     screen_manager.add_widget(ScreenTwo(name = "screen_two")) 

     return screen_manager #after building the screens, return them 
#MyScreenManager.login() 

sample_app = ScreenChangeApp() 
sample_app.run() 

unter Meine KV Datei

gezeigt folgt, ist
#: import os os 
<[email protected]>: 
    font_size: 12 
    size_hint: .2,.1 

<[email protected]>: 
    id: image 

<ScreenOne>: #define The First Screen 
    BoxLayout: #Use box layout 
     Button: #create button 
      text: "Connect to the Raspberry Pi" 
      on_press: 
       root.login() 
       root.gpioSet() 
       root.manager.transition.direction= "left" 
       root.manager.transition.duration = 1 
       root.manager.current = "screen_two" 

<ScreenTwo>: 
    BoxLayout: 
     spacing: 10 
     padding: 10 
     orientation: "vertical" 
     CustomButton: 
      text: "Send an ls command" 
      on_press: 
       root.command("ls") 

     CustomButton: 
      text: "Take picture" 
      on_press: 
       root.command("python cameradaemon.py &") #'&' runs script in background 
       root.command("sleep .1") 
       root.command("echo '1' > /sys/class/gpio/gpio18/value") #set pin high to take pic 
       root.command("echo '0' > /sys/class/gpio/gpio18/value") #take it off to prevent another photo 

       root.command("scp TEST.jpg [email protected]:C:/Users/Jason/Desktop/RaspberryPiTransferred")   
       root.command("kill %1") 



     CustomButton: 
      text: "Create Histogram" 
      on_press: 
       os.system("cd C:/Users/Jason/Desktop/KivyFiles/Histogram & python histogram.py") 


    MyPicture 

Was ich bekomme, ist die folgende GUI Bildschirm GUI Screen.

Das Bild wird unten links auf dem Bildschirm angezeigt.

Wenn ich „nehmen Bild-Taste“ drücken aktualisiert sie wie in diesem Screenshot gezeigt Image after pic is taken

aber ich wie ich will nicht die Kontrolle über die Platzierung haben.

Ursprünglich hatte ich das Bild auf der oberen rechte Ecke des Bildschirms mit anderem Code erscheinen, aber ich war das Bild nicht in der Lage dynamisch Older GUI placement Mein vorheriger Code in einem Anker-Layout, das Bild gesetzt zu aktualisieren, aber es war statisch. Jetzt, da ich ein Canvas verwende, wird es mit meinem aktuellen Code aktualisiert, aber ich kann es nicht wie zuvor platzieren.

Der Teil, wo ich "size_hint" setze, tut nichts, ich habe nur an diesem Punkt raten und überprüft.

Gibt es eine einfachere Möglichkeit, diese Picture-Klasse in der KV-Klasse aufzurufen, so dass das Bild in einem bestimmten Layout festgelegt wird? Zum Beispiel

AnchorLayout: 
    anchor_x: 'right' 
    anchor_y: 'left' 
    BoxLayout: 
     spacing: 10 
     padding: 10 
     Image: 
      <Dynamic image goes here> 

Wo statt "Dynamisches Bild hier geht:" Ich hatte

source: <location of image> 

Antwort

0

Sie einen anderen BoxLayout mit der Horizontalen (Standard) Orientierung verwenden:

<ScreenTwo>: 
    BoxLayout: 
     BoxLayout: 
      size_hint_x: .5 
      spacing: 10 
      padding: 10 
      orientation: "vertical" 

      ... 

     AnchorLayout: 
      anchor_x: 'right' 
      anchor_y:'top' 
      MyPicture: 
       size_hint_y: .5 

withis Code I Holen Sie sich die Ausgabe:

aber sincerily ziehe ich eine floatlayout verwenden und fixieren die pos und Größe selbst

so etwas wie dies mit dem Schwimmer Layout:

<ScreenTwo>: 
    BoxLayout: 
     BoxLayout: 
      size_hint_x: .5 
      spacing: 10 
      padding: 10 
      orientation: "vertical" 

      ... 

     FloatLayout: 
      size_hint_x: .5 
      MyPicture: 
       pos_hint: {'center_x': .5, 'y': .5} #edit this like you want 
+0

Ich fügte hinzu, dass in meine kv-Datei, aber ich immer noch mit dem Bild am Ende erscheint in der unteren linken Ecke des Bildschirms – Jason

+0

In dem Code, den Sie anzeigen, haben Sie die Bilddatei mit einer Quelle. Dies bedeutet, dass es statisch ist. Ich brauche diese Bilddatei, um jede Sekunde zu aktualisieren. Mein Code nimmt ein Bild und ersetzt die Bilddatei an dieser Quelle. Ich habe die Methode verwendet, die Sie gezeigt haben, aber ich weiß nicht, wie man es so macht, dass die Bilddatei aktualisiert – Jason

+0

@Jason bitte versuchen Sie diesen Code mit yout "statischen" Bild und sagen Sie mir, ob es funktioniert, bevor Sie versuchen es mit einem dynamischen Bild –

Verwandte Themen