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>
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
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
@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 –