【问题标题】:How can I make code run as the GUI remains open在 GUI 保持打开状态时如何使代码运行
【发布时间】:2021-12-24 21:44:15
【问题描述】:

我正在编写一个代码来处理图像,并且我正在尝试使用 PySimpleGUI 制作一个 GUI。我希望我的代码在 gui 仍然打开时在后台运行,但是除非我关闭 GUI 然后代码继续运行,否则代码不会继续。我试图在添加“break”函数之前放置处理代码,但是,我给出了一个错误代码,即break在循环之外

import io
import os
import PySimpleGUI as sg
from PIL import Image, ImageDraw, ImageEnhance, ImageOps
import PIL.ImageOps
file_types = [
              ("All files (*.*)", "*.*")]

image_viewer_column=[
    [sg.Text("HANG IN THERE\n"
             "YOUR IMAGE IS PROCESSING\n"
             "WE'RE TURNING IT INTO A PRINTABLE VERSION \n"
             "NOT TOO LONG NOW")],
    [sg.Text(size=(40,1), key="-TOUT-")],
    [sg.Image(key="-IMAGE-0")],
    ]

file_list_column = [
        [sg.Image(key="-IMAGE-")],
        [
            sg.Text("PROCESSING IMAGE"),
            sg.Button("Cancel"),
        ],
        [
            sg.Button("Close"),
        ],
    ]

layout = [
    [
       sg.Column(file_list_column),
       sg.VSeparator(),
       sg.Column(image_viewer_column),
    ]
]

window = sg.Window("Image Converter", layout)
while True:
        event, values = window.read()


image = Image.open('output.png')
inverted_image = PIL.ImageOps.invert(image)
inverted_image.save('output.png')

break


window.close()

无论如何我可以做到这一点吗?任何帮助将不胜感激

【问题讨论】:

  • 你需要使用线程

标签: python pysimplegui


【解决方案1】:

语句 break 应包含在 Python 中的 whilefor 循环中,以跳出循环。

在这里,您可以在布局中放置一个按钮以在单击按钮时生成一个事件,例如sg.Button('Convert'),然后如果处理时间不太长,则您的while循环中事件情况下的处理代码,否则您需要使用线程来处理。

window = sg.Window("Image Converter", layout)

while True:

    event, values = window.read()

    if event == sg.WINDOW_CLOSED:
        break
    elif event == 'Convert':
        image = Image.open('output.png')
        inverted_image = PIL.ImageOps.invert(image)
        inverted_image.save('output.png')

window.close()

或者在你的事件 while 循环之前做。

window = sg.Window("Image Converter", layout, finalize=True)
image = Image.open('output.png')
inverted_image = PIL.ImageOps.invert(image)
inverted_image.save('output.png')

while True:

    event, values = window.read()

    if event == sg.WINDOW_CLOSED:
        break

window.close()

【讨论】:

  • 如果您确实需要线程,有一个 Window 方法 Window.perform_long_operation() 可以提供帮助,您无需了解线程的工作原理。
猜你喜欢
  • 2012-02-21
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多