寻求一种在RPi上显示图像并继续python执行的简单方法

时间:2017-08-23 23:57:05

标签: python image raspberry-pi display

我将应用程序转移到RPi,我需要一种方法来显示使用python(3)的全屏图像,同时代码继续执行。我想避免深入研究像Tkinter和Pygame这样复杂的GUI模块。我只是希望图像填满屏幕并保持在那里直到代码替换它们或告诉它们消失。如果Tkinter或Pygame可以做到这一点,那就没问题,但在我看来他们都进入了最终需要键盘输入的循环。我的应用涉及监控传感器和外部输入,但没有连接键盘。我尝试过以下方法:

用subprocess.call激活(这会显示图像,但代码会停止执行,直到按键清除图像为止。

wand.display(这可行,但只显示一个小窗口,而不是全屏)

fbi(无法让它显示图像)

xcd-open(工作但在"图像查看器和#34;小窗口中的应用程序中打开 - 没有鼠标点击的全屏选项)

我还没有尝试过OpenCV。这似乎可能有用,但是为这个简单的应用程序带来了很多基础设施。

为了记录,我去谷歌并花了很多时间。此要求是最后的手段。

如果你想要一些伪代码:

displayImage("/image_folder/image1.jpg" fullscreen = True)
time.sleep(1)
clearImage()
displayImage("/image_folder/image2.jpg" fullscreen = True)

1 个答案:

答案 0 :(得分:0)

您没有通过 feh 和子流程显示 的尝试方式,但也许可以尝试在后台启动它,这样就不会阻止您主线:

 import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;

    import org.testng.Assert;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.WebDriverWait;
    **import org.testng.annotations.BeforeClass;
    import org.testng.annotations.DataProvider;
    import org.testng.annotations.Test;**here is some issue this lib is not added in selenium jar.


    import jxl.Sheet;
    import jxl.Workbook;
    import jxl.read.biff.BiffException;

    public class ReadExcelDataProvider {
        public WebDriver driver;
        public WebDriverWait wait;
        String appURL = "https://www.linkedin.com/";

        //Locators
        private By byEmail = By.id("session_key-login");
        private By byPassword = By.id("session_password-login");
        private By bySubmit = By.id("signin");
        private By byError = By.id("global-alert-queue");

        @BeforeClass
        public void testSetup() {
            driver=new FirefoxDriver();
            driver.manage().window().maximize();
            wait = new WebDriverWait(driver, 5);
        }


        @Test(dataProvider="empLogin")
        public void VerifyInvalidLogin(String userName, String password) {
            driver.navigate().to(appURL);
            driver.findElement(byEmail).sendKeys(userName);
            driver.findElement(byPassword).sendKeys(password);
            //wait for element to be visible and perform click
            wait.until(ExpectedConditions.visibilityOfElementLocated(bySubmit));
            driver.findElement(bySubmit).click();

            //Check for error message
            wait.until(ExpectedConditions.presenceOfElementLocated(byError));
            String actualErrorDisplayed = driver.findElement(byError).getText();
            String requiredErrorMessage = "Please correct the marked field(s) below.";
            Assert.assertEquals(requiredErrorMessage, actualErrorDisplayed);

        }

        @DataProvider(name="empLogin")
        public Object[][] loginData() {
            Object[][] arrayObject = getExcelData("D:/sampledoc.xls","Sheet1");
            return arrayObject;
        }

        /**
         * @param File Name
         * @param Sheet Name
         * @return
         */
        public String[][] getExcelData(String fileName, String sheetName) {
            String[][] arrayExcelData = null;
            try {
                FileInputStream fs = new FileInputStream(fileName);
                Workbook wb = Workbook.getWorkbook(fs);
                Sheet sh = wb.getSheet(sheetName);

                int totalNoOfCols = sh.getColumns();
                int totalNoOfRows = sh.getRows();

                arrayExcelData = new String[totalNoOfRows-1][totalNoOfCols];

                for (int i= 1 ; i < totalNoOfRows; i++) {

                    for (int j=0; j < totalNoOfCols; j++) {
                        arrayExcelData[i-1][j] = sh.getCell(j, i).getContents();
                    }

                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
                e.printStackTrace();
            } catch (BiffException e) {
                e.printStackTrace();
            }
            return arrayExcelData;
        }

        @Test
        public void tearDown() {
            driver.quit();
        }
    }

请注意,后台进程(即以subprocess.call("feh -F yourImage.jpg &", shell=True) 开头的进程)正在使用shell的一个功能,因此我设置了&

然后,在显示下一个图像之前,终止上一个实例:

shell=True

或者,如果您知道您计划提前显示的所有图片的名称,则可以在&#34;幻灯片模式&#34; 中开始 feh 通过在启动时传入所有图像名称),然后在每次想要推进图像时传送信号subprocess.call("pkill feh")

SIGUSR1

如果上述方法无效,请点击原始问题下的os.kill(os.getpid(...), signal.SIGUSR1) 并添加以下命令的输出,以便我们可以沿着帧缓冲路径前进:

edit