我正在尝试构建一个显示两列的 GUI:一列将包含所有输入字段和列表框,第二列将显示来自pandas dataframe.
我认为使用 来执行此操作是一个好主意Frames,但在尝试创建时遇到错误Frame:
layout = [sg.Frame('Input data',[[
sg.Text('Input:'),
sg.Input(do_not_clear=False),
sg.Button('Read'), sg.Exit(),
sg.Text('Alternatives:'),
sg.Listbox(values=('alternatives...', ''), size=(30, 2), key='_LISTBOX_')]])]
Run Code Online (Sandbox Code Playgroud)
结果:
TypeError:* 之后的 AddRow() 参数必须是可迭代的,而不是 Frame
如何解决这个问题?
我在想是否可以先使用 定义列,Frame然后将列放入 的定义中layout?
我试图让我的 GUI 根据组合框中选择的项目显示信息。PySimpleGUI食谱说我应该使用GetSelectedItemsIndexes()方法,但是当我尝试使用它时:
window.Element('_COMBOBOX_').GetSelectedItemsIndexes()
Run Code Online (Sandbox Code Playgroud)
我明白了:
AttributeError:“Combo”对象没有属性“GetSelectedItemsIndexes”
我尝试在控制台中输入以下内容:
dir(window.Element('_COMBOBOX_'))
Run Code Online (Sandbox Code Playgroud)
似乎根本GetSelectedItemsIndexes不存在...那么我怎样才能从组合框中获取所选值的索引呢?
我希望使用 Pysimplegui 在图像上绘制一个矩形。我曾尝试使用 Graph 对象来完成此操作,但据我所知,您无法对图像对象执行任何操作。我在 Pygame 中找到了一个替代方案,但我的脚本已经在 pysimplegui 中构建到了这一点。是否存在此功能/演示?
我用 PySimpleGui 4.15.1 在 python 3.8.1 中编写了一个游戏冷拳击模拟器 2 的黑客代码,如果我尝试单击开始/停止按钮,GUI 会冻结,但脚本与开始/停止按钮连接仍在运行。但是,如果我将连接到“开始/停止”按钮的脚本更改为“Print(\'Chicken\')”之类的内容,那么它的工作完全完美\xe2\x80\xab\xe2\x81\xab\xe2\x81\xaf\xe2\ x80\xab\xe2\x81\xab\xe2\x81\xaf\xe2\x80\xab\xe2\x81\xab\xe2\x81\xaf\xe2\x80\xab\xe2\x81\xab\xe2\x80\ xab\xe2\x81\xab\xe2\x80\xab\xe2\x81\xab\xe2\x80\xab\xe2\x80\xab\xe2\x80\xab\xe2\x80\xab\xe2\x80\xab
\n\n这是代码:
\n\nimport PySimpleGUI as sg\nimport ctypes\nimport time\nimport pynput\n\nsg.theme(\'DarkBrown1\')\n\nlayout = [ [sg.Text(\'BOXING SIMULATOR 2 HACK\', size=(20, 2), justification=\'center\')],\n [sg.Text(\'\', size=(10, 2), font=(\'Helvetica\', 20), justification=\'center\', key=\'_OUTPUT_\')],\n [sg.T(\' \' * 5), sg.Button(\'Start/Stop\', focus=True), sg.Quit()]]\n\nwindow = sg.Window(\'BOXING SIMULATOR 2 HACK\', layout)\n\nSendInput = ctypes.windll.user32.SendInput\n\nPUL = ctypes.POINTER(ctypes.c_ulong)\nclass KeyBdInput(ctypes.Structure):\n _fields_ = [("wVk", ctypes.c_ushort),\n ("wScan", ctypes.c_ushort),\n ("dwFlags", ctypes.c_ulong),\n ("time", ctypes.c_ulong),\n ("dwExtraInfo", PUL)]\n\nclass HardwareInput(ctypes.Structure):\n _fields_ = [("uMsg", ctypes.c_ulong),\n ("wParamL", ctypes.c_short),\n ("wParamH", ctypes.c_ushort)]\n\nclass MouseInput(ctypes.Structure):\n _fields_ = …Run Code Online (Sandbox Code Playgroud) 我想禁用代码中的“开始更新”按钮
代码 :
import PySimpleGUI as sg
import time
mylist = ["task 1", "task 2", "task 3", "task 4"]
progressbar = [
[sg.ProgressBar(len(mylist), orientation='h', size=(51, 10), key='progressbar')]
]
outputwin = [
[sg.Output(size=(78,20))]
]
layout = [
[sg.Frame('Progress',layout= progressbar)],
[sg.Frame('Output', layout = outputwin)],
[sg.Submit('Start update'),sg.Cancel()]
]
window = sg.Window('Assistant updater', layout)
progress_bar = window['progressbar']
while True:
event, values = window.read(timeout=10)
if event == 'Cancel' or event is None:
break
elif event == 'Start update':
for i,item in enumerate(mylist):
print(item)
if item=="Reading …Run Code Online (Sandbox Code Playgroud) 我刚刚开始学习 PySimpleGUI,我想创建一个自定义 GUI 进度条,它将显示程序的哪些部分在不同时间正在运行。
例如,我有一个包含各种组件的视频处理程序,因此我希望进度栏显示如下文本:
“从视频中提取第一帧”
“裁剪图像”
“删除重复图像”
但所有这些行都需要从程序中的不同函数更新进度条窗口,其中与包含进度条的窗口关联的 GUI 代码未运行。
我的代码:
image_name_list = Frame_Capture(f"{main_dir}\\{input_line2}.mp4") # Generates image list of frames of video
Remove_Duplicates(image_name_list) # Removes duplicate images
print("Enter name of pdf file")
pdf_name = f'{input()}.pdf'
makePdf(pdf_name, image_name_list) # Converts images to pdf
Cleanup(image_name_list) # Deletes unneeded images
os.startfile(pdf_name)
Run Code Online (Sandbox Code Playgroud)
在这里,当我的程序本身的 GUI 组件在程序的另一部分中运行时,我需要从“Frame_Capture”、“Remove_Duplicates”、“makePDF”和“Cleanup”功能中更新 GUI 进程栏。
我能想到的两种解决方案是:
这些解决方案听起来都不好。我还有其他方法可以做到这一点吗?
在使用 Linux (Ubuntu 20.10) 时,PySimpleGui的演示应用程序示例似乎开箱即用地显示“丑陋”字体。
由于我在提供的演示示例中找不到任何有关如何控制它的参考,例如default_font = 'Helvetica'),这些示例似乎隐含地假定默认字体设置应该已经正确。
为了尝试解决这个问题,我已经安装了Helvetica默认的 Windows 字体,但它仍然与在线描述的示例不同。
下面的例子显然不是 Helvetica。
我该如何解决这个问题?
import PySimpleGUI as sg
'''
App that shows "how fonts work in PySimpleGUI".
'''
layout = [[sg.Text('This is my sample text', size=(20, 1), key='-text-')],
[sg.CB('Bold', key='-bold-', change_submits=True),
sg.CB('Italics', key='-italics-', change_submits=True),
sg.CB('Underline', key='-underline-', change_submits=True)],
[sg.Slider((6, 50), default_value=12, size=(14, 20),
orientation='h', key='-slider-', change_submits=True),
sg.Text('Font size')],
[sg.Text('Font string = '), sg.Text('', size=(25, 1), key='-fontstring-')],
[sg.Button('Exit')]]
window = sg.Window('Font string …Run Code Online (Sandbox Code Playgroud) 我正在用来PySimpleGUI创建一个文本输出框。
打开程序时,我希望输出在按下任何按钮之前显示一些默认文本。
我怎样才能让这种情况发生?window.Read()等待按下按钮。window.refresh()似乎并没有将文本强制显示到窗口。
import PySimpleGUI as sg
initialString = "I want this text to display on window opening."
def gui2():
layout = [
[sg.Output(size=(90,20), background_color='black', text_color='white')],
[sg.Button('Do things'), sg.Button('Exit')]
]
window = sg.Window("Funny Title", layout)
#window.read() #I need to press a button before the text will display
#window.refresh() #doesn't refresh the output
print(initialString)
#window.refresh() #doesn't refresh the output
while True:
event, values = window.read()
if event in (sg.WIN_CLOSED, 'Exit'):
break
elif event == 'Do …Run Code Online (Sandbox Code Playgroud) 我正在开发图像查看器,但我注意到在图像查看器中,当要显示的链接太长时,它会被切断。我怎样才能修改这段代码,以便如果字符串太长,它会在新行上打印它。我正在遵循指南,因此您可以查看https://realpython.com/pysimplegui-python/
# img_viewer.py
import PySimpleGUI as sg
import os.path
# First the window layout in 2 columns
file_list_column = [
[
sg.Text("Image Folder"),
sg.In(size=(25, 1), enable_events=True, key="-FOLDER-"),
sg.FolderBrowse(),
],
[
sg.Listbox(
values=[], enable_events=True, size=(40, 20), key="-FILE LIST-"
)
],
]
# For now will only show the name of the file that was chosen
image_viewer_column = [
[sg.Text("Choose an image from list on left:")],
[sg.Text(size=(40, 1), key="-TOUT-")],
[sg.Image(key="-IMAGE-")],
]
# ----- Full layout -----
layout = [
[
sg.Column(file_list_column), …Run Code Online (Sandbox Code Playgroud) 我是 Python 和 PySimpleGUI 的新手,我不知道如何强制我的应用程序处理事件<Enter>键;这是我的代码:
# Text field
sg.InputText(
key=key,
default_text='',
enable_events=True,
),
...
window = self.graphic_interface.window
while self.is_running:
self.event, self.values = window.read(timeout=0)
...
if event in INSERT_SN_KEYS:
key = event
if values[key]is not None:
# Accept only numbers
if values[key][-1] not in '0123456789':
window[key].update(values[key][:-1])
Run Code Online (Sandbox Code Playgroud)
我的代码可以处理用户按下的任何键,除了<Enter>; 我还没有找到任何类似于 Button 类中使用的“bind_return_key=True”的 InputText 参数。
我该怎么做?