PySimpleGui Rick 单击菜单剪贴板,用于通过 extend_layout

如何解决PySimpleGui Rick 单击菜单剪贴板,用于通过 extend_layout

TL;DR:我基本上是想弄清楚如何从 PySimpleGui Github 中合并这两个示例代码https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_Layout_Extend.pyhttps://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_Multiline_Right_Click_Menu_Clipboard.py 其中传递给剪贴板函数的元素键已动态创建...

使用 PySimpleGui 的文档以及有关 stackoverflow 和 Github 演示的大量信息,我制作了一个“简单”的 gui,可以添加删除输入字段,并且我已针对该方面的所有内容进行了排序(即添加元素到GUI 使用 layout_extend,使用 .hide_row() 删除元素并保留已删除值的列表等...

就像 layout_extend 演示一样,我使用了一个框架,并使用迭代器向其添加 GUI 元素以确保创建唯一的“键”。

##CODE SNIPPET AS MOST OF IT IS PRETTY MUCH THE SAME AS THE EXAMPLE DEMO CODE WITH MInor CHANGES

right_click_menu = ['',['copy','Paste','Select All','Cut']]

def do_clipboard_operation(event,window,element):
    #Same as Demo Code Here No Point copying!

...
...

if event in right_click_menu[1]:
    do_clipboard_operation(event,program_window,element)
if event == '-ADdpath-':
    program_window.extend_layout(program_window['-FRAME1-'],[[sg.Text('PATH:'),sg.Input(key=f'-PATH{i}-',rick_click_menu=right_click_menu),sg.Folderbrowse(initial_folder="/base/path",key=f'-broWSEPATH{i}-'),sg.Button('Remove Path',key=f'-REMOVEPATH{i}-')]])
    i += 1
...
...

用户看到一个输入字段时,他们想在其中放置一长串文本(在我的情况下是文件夹路径),因此需要“右键单击上下文菜单”,因此我想考虑添加

我的问题是多行 Rick 单击菜单剪贴板演示需要传递给函数的触发元素键(然后用于添加/删除文本),但因为我有“动态生成”键名元素 我需要确定哪个元素键激活了右键单击菜单才能传递它,我只是不知道该怎么做.....

我写的代码和 Layout_extend demo 基本一致.....

我很欣赏 PySimpleGui,尽管它很棒,但它可能并不是处理动态 GUI 的最佳工具,但由于我一直在为 OO 编程而苦苦挣扎,这几乎是我能够构建功能性图形的唯一方法迄今为止的 Python GUI....

如果在这个阶段这不可能,那没关系,但至少我问过(这让我感觉好多了,当我不可避免地听到有人说'它真的很烦人,我不能右键单击'时,他们使用它)!!

一如既往地提前致谢!!

欧文。

编辑:: 添加代码(必须删除对特定细节的一些引用 - 根路径和其他此类信息,在数据存在的位置放置“”周围的占位符 - 但代码是相同的:


#!/bin/python3

import PySimpleGUI as sg
import os.path
from getpass import getuser
from string import ascii_letters,digits
from random import choice as rchoice

SPLASH_IMAGE_PATH=r'<AN IMAGE FILE LOCATION>'
OUT_PATH='./'
disPLAY_SPLASH_MS = 1500
REMOVE_LIST=[]
VERSION_NUM='0.3.0'

splash_theme = {'BACKGROUND': '#ffcc00','TEXT': '#000000','INPUT': '#ffffff','TEXT_INPUT': '#ffffff','SCROLL': '#ffffff','BUTTON': ('white','#000000'),'PROGRESS': ('#ffffff','#ffffff'),'BORDER': 0,'SLIDER_DEPTH': 0,'PROGRESS_DEPTH': 0
}

right_click_menu = ['',element):
    print(event)
    print(window)
    print(element)

##Random string generator: https://www.stackoverflow.com/questions/2257441/random-sting-generation-with-upper-case-letters-and-digits (Ignacio Vazquez-Abrams answer)
def random_string_gen(size=8,chars=ascii_letters + digits):
    return ''.join(rchoice(chars) for _ in range(size))

def main():
    sg.theme_add_new('SplashScreen',splash_theme)
    sg.theme('SplashScreen')
    splash_window= sg.Window('Uploader',[[sg.Image(SPLASH_IMAGE_PATH)],[sg.Text('Uploader',font=("any",20))],[sg.Text(f'Version: {VERSION_NUM}',font=('any',12))]],element_justification='c',no_titlebar=True,keep_on_top=True).read(timeout=disPLAY_SPLASH_MS,close=True)

    sg.theme('DarkAmber')
    layout = [ [sg.Text('Please Enter FULL Paths. Use The browse Button To Navigate,Or copy Path Into Field.')],[sg.Text('Use The "Add Path" Button To Add More Rows,And The "Remove Path" Button To Remove A Row.')],[sg.Text('When Finished,Press The "Upload" Button - This Will Take Time To Process.')],[sg.Frame('Paths:',sg.Input(key='-PATH0-',right_click_menu=right_click_menu),sg.Folderbrowse(initial_folder="<ROOT PATH>",key='-broWSEPATH0-' ),key='-REMOVEPATH0-')]],key='-FRAME1-')],[sg.OK('Upload',key='-RUN-'),sg.Button('Add Additional Path',key='-ADdpath-'),sg.Cancel('Exit',key='-EXIT-')]
    ]

    program_window = sg.Window('Uploader',layout)
    i = 1
    num_rows=1
    user=str(getuser())
    while True:
        event,values = program_window.read()
        if event == sg.WIN_CLOSED or event == '-EXIT-':
            break
        if event in right_click_menu[1]:
            print(values)
           # do_clipboard_operation(event,element)
        if event == '-ADdpath-':
            ##Add new row to output window. uses f' ' string formatting to use the i iterator to create unique keys
            program_window.extend_layout(program_window['-FRAME1-'],key=f'-broWSEPATH{i}-' ),key=f'-REMOVEPATH{i}-')]])
            i += 1
            num_rows += 1
        if event == '-RUN-':
            ##Iterate over values and remove duplicates (both the text field and the browse button can be populated with the same data so duplicates cannot be avoided
            ##Remove blank values (can occur when path is pasted into text field and browse button not used,and remove any paths that occur in the remove_list. generated when lines are removed
            ##Remove items that appear in REMOVE_LIST (created when removing lines)
            ##Output to a new out_list as items in value cannot be changed
            ##Validate User input to: ensure no <AVOID PATH> paths,no invalid paths,at least one path is submitted,and path submitted actually contains an <SPECIFIC FILES>... Show popup errors if any found and allow user to remove / alter offending paths.
            ##If all is OK generate a random string with the username appended and write all valid paths into a temp file with that random name. This is for back-end program to run.
            out_list = []
            error_list = []
            avoid_path_error=False
            invalid_path=False
            for key,value in values.items():
                if value not in out_list and not value == '' and not value in REMOVE_LIST:
                    if '<AVOID PATH>' in value:
                        avoid_path_error=True
                        sg.popup('One Or More Of Your Paths Is Located In The <AVOID PATH> And Cannot Be Used As An Input!\n\nPlease Remove The Offending Path.',title='<AVOID PATH> FOUND',keep_on_top=True,custom_text=('Sorry'),button_color=('white','red'))
                        break
                    elif not os.path.isdir(value):
                        invalid_path=True
                        sg.popup(f'The Following Invalid Path Has Been Entered And Does Not Seem To Exist / Is Unreadable:\n\n{value}',title='INVALID PATH ENTERED',custom_text=('Oops!'),'red'))
                        break
                else:
                    out_list.append(value)
                    if not avoid_path_error ==  True and not invalid_path == True:
                        if not out_list:
                            sg.popup('You Have Not Added Any Paths!!! Please Try Again',title='NO PATH ENTERED','red'))
                    else:
                        for path in out_list:
                            for files in os.listdir(path):
                                if '<SPECIFIC FILE>' in files.lower():
                                    break
                                else:
                                    error_list.append(path)
                        if error_list:
                            error_list_string = '\n'.join(error_list)
                            sg.popup(f'The Following Path(s) Do NOT Contain <SPECIFIC FILE>...\nPlease ONLY Add Full Paths:\n\n{error_list_string}',title='NO <SPECIFIC PATH> FOUND',custom_text=('Sorry!'),'red'))
                        else:
                            print(random_string_gen() + '.' + user)
                            break
            if '-REMOVEPATH' in event:
                ##Remove Line from window. values Dict cannot be altered,so need to generate a new list with the values of the data held in the value dict: -PATHx- and -broWSEPATHx-
                ##Where x is the unique iterator number used to ensure unique keys. The Event also uses the same unique iterator key: -REMOVEPATHx- so replacing -REMOVEPATH with -PATH and -broWSEPATH
                ##generates the keys we need. call the hide_row() function to remove row from window,and append both -PATHx- and -broWSEPATHx-.
                folder_path=str(event).replace("-REMOVEPATH","-PATH")
                browse_path=str(event).replace("-REMOVEPATH","-broWSEPATH")
                num_rows -= 1
                if num_rows == 0:
                    program_window[event].hide_row()
                    program_window.extend_layout(program_window['-FRAME1-'],key=f'-REMOVEPATH{i}-')]])
                    i += 1
                    num_rows = 1
                else:
                    program_window[event].hide_row()
                    REMOVE_LIST.append(values[folder_path])
                    REMOVE_LIST.append(values[browse_path])
    program_window.close()


if __name__ == "__main__":
    main()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?