【问题标题】:Connect/Process a script to PySimpleGUI button将脚本连接/处理到 PySimpleGUI 按钮
【发布时间】:2019-12-03 15:13:34
【问题描述】:

你们能帮我知道如何在我的 PySimpleGui 脚本中连接一个按钮,当按下/单击运行按钮时,它将执行另一个 python 脚本。

目前,我一直在阅读有关 Subprocess 和 command = os.popen 的 GUI 脚本。

layout = [[ sg.Text('Click the button to launch Program')],
           [sg.Button('Launch')]]

win1 = sg.Window('My new window').Layout(layout)


win2_activate = False

while True:
    ev1, vals1 = win1.Read()
    if ev1 is None or ev1 == 'Cancel':
        break

    if not win2_activate and ev1 == 'Launch':
        win1.Hide()
        win2_activate = True
        layout2 = [[sg.Text('Report Auto')],
                    [sg.Input(do_not_clear=True)],
                    [sg.Text('', key='_OUTPUT_')],
                    [sg.Button('Run'), sg.Button('Cancel')]]

        win2 = sg.Window('Window2').Layout(layout2)
        while True:        
            ev2, vals2 = win2.Read()
            if ev2 is None or ev2 =='Cancel':
                win2_activate = False
                win2.Close()
                win1.UnHide()
                break

在我的 pysimplegui 脚本中,我还没有包含子进程或任何库,因为我只是不知道在哪里做。欢迎任何帮助!

【问题讨论】:

  • 项目的 GitHub 上有几个演示程序,向您展示如何从基于 PySimpleGUI 的程序启动程序。您发布的程序会打开 2 个窗口。您是否要模拟启动程序? Demo_Desktop_Floating_Toolbar.py 使用 subprocess.Popen 启动程序。 Demo_Script_Launcher_Realtime_Output.py 在窗口中显示启动程序的输出。还有另外 5 或 6 个其他示例。
  • 非常感谢!在去检查的路上!
  • 如果您有任何问题,请随时在该 GitHub 上打开一个问题。
  • 发布的答案是否符合您的要求?
  • 现在 PySimpleGUI 中还有一个API for executing commands

标签: python button subprocess command pysimplegui


【解决方案1】:

这是您问题的完整答案,一个 PySimpleGUI 程序。 该程序允许您输入命令。然后按一个按钮。 按下按钮时,命令为“运行”,输出显示在窗口中。

import subprocess
import sys
import PySimpleGUI as sg

def main():
    layout = [  [sg.Text('Enter a command to execute (e.g. dir or ls)')],
                [sg.Input(key='_IN_')],             # input field where you'll type command
                [sg.Output(size=(60,15))],          # an output area where all print output will go
                [sg.Button('Run'), sg.Button('Exit')] ]     # a couple of buttons

    window = sg.Window('Realtime Shell Command Output', layout)

    while True:             # Event Loop
        event, values = window.Read()
        if event in (None, 'Exit'):         # checks if user wants to exit
            break

        if event == 'Run':                  # the two lines of code needed to get button and run command
            runCommand(cmd=values['_IN_'], window=window)

    window.Close()

# This function does the actual "running" of the command.  Also watches for any output. If found output is printed
def runCommand(cmd, timeout=None, window=None):
    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    output = ''
    for line in p.stdout:
        line = line.decode(errors='replace' if (sys.version_info) < (3, 5) else 'backslashreplace').rstrip()
        output += line
        print(line)
        window.Refresh() if window else None        # yes, a 1-line if, so shoot me
    retval = p.wait(timeout)
    return (retval, output)                         # also return the output just for fun

if __name__ == '__main__':
    main()

【讨论】:

    【解决方案2】:

    要让按钮做某事,你只需要输入:

    if event in #<enter KEY here>:
        #do your action
    

    将 KEY 替换为按钮的键(通常是名称,在您的情况下为“启动”)

    然后使变量(例如LaunchWindow)为真,而不是从另一个窗口调用“启动”按钮。我不认为 PySimpleGUI 喜欢那样...

    【讨论】:

      猜你喜欢
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 2014-04-29
      • 2022-10-16
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      相关资源
      最近更新 更多