如何解决PySimpleGui Rick 单击菜单剪贴板,用于通过 extend_layout
TL;DR:我基本上是想弄清楚如何从 PySimpleGui Github 中合并这两个示例代码:https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_Layout_Extend.py 和 https://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 举报,一经查实,本站将立刻删除。