如何防止 2nd window 上的复选框引起的错误?
How to prevent error cause by checkbox on 2nd window?
我正在尝试将 pysimplegui 用作其他人的 gui 运行 我的代码。我设法创建了一个 2 window gui,其中第二个 window 供管理员使用。但是我发现如果我做几次进入和退出windows2,就会报错
以下是可能会发生错误的代码示例。单击管理>设置时将弹出第二个 window。然后,如果我要退出并再输入几次(<4 次),就会发生错误。
错误是:
File "<ipython-input-2-4e0963ff7cf8>", line 1, in <module>
runfile('C:/Python/test.py', wdir='C:/Python')
File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
execfile(filename, namespace)
File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Python/test.py", line 29, in <module>
(ev2, vals2) = win2.Read()
File "C:\ProgramData\Anaconda3\lib\site-packages\PySimpleGUI\PySimpleGUI.py", line 5284, in Read
self._Show()
File "C:\ProgramData\Anaconda3\lib\site-packages\PySimpleGUI\PySimpleGUI.py", line 5163, in _Show
return _BuildResults(self, False, self)
File "C:\ProgramData\Anaconda3\lib\site-packages\PySimpleGUI\PySimpleGUI.py", line 6754, in _BuildResults
_BuildResultsForSubform(form, initialize_only, top_level_form)
File "C:\ProgramData\Anaconda3\lib\site-packages\PySimpleGUI\PySimpleGUI.py", line 6843, in _BuildResultsForSubform
value = element.TKIntVar.get()
File "C:\ProgramData\Anaconda3\lib\tkinter\__init__.py", line 506, in get
value = self._tk.globalgetvar(self._name)
TclError: can't read "PY_VAR60": no such variable
其中 "PY_VAR60" 中的数字“60”可以更改为任意数字。
import PySimpleGUI as sg
menu_def= [['&Admin',['&Settings','&About']]]
layout1=[
[sg.Menu(menu_def)],
[sg.Text('Input WaferID:', size=(12, 1), font=('Calibri',15))],
[sg.Button('Exit')]
]
layout2 = [
[sg.Checkbox('Rename file?',key='rename', size=(15,1)),sg.Text('Split:')],
[sg.InputText()],
[sg.Button('Exit')]
]
win1 = sg.Window('Oxidation Object Detection V1.0').Layout(layout1)
win2_active = False
while True:
(ev1, vals1) = win1.Read()
if ev1 == 'Settings':
win2_active = True
win2 = sg.Window('Settings').Layout(layout2)
while True:
(ev2, vals2) = win2.Read()
if ev2 == 'Exit' or ev2 == None:
win2.Close()
win2_active = False
break
elif ev1 == 'Exit' or ev1 == None:
win1.Close()
break
我试过用sg.InputText替换window2的复选框,不会有错误。使用复选框时有什么我想念的吗?
谢谢。
我查看了代码,并自己尝试了,但没有使用变量 'PY_VAR60' 或数字 60。错误 - TclError: can't read "PY_VAR60": no such variable - 建议您需要在某处定义该变量,除非您在其他代码中的其他地方完成了该操作。
希望对您有所帮助。
在查看了更多示例后,我想我找到了答案。 "layout 2" 似乎必须放在 "win2_active = True" 之后。我试了几次打开和退出都没有错误。有人知道为什么吗?
更正后的代码如下:
import PySimpleGUI as sg
menu_def= [['&Admin',['&Settings','&About']]]
layout1=[
[sg.Menu(menu_def)],
[sg.Text('Input WaferID:', size=(12, 1), font=('Calibri',15))],
[sg.Button('Exit')]
]
win1 = sg.Window('Oxidation Object Detection V1.0').Layout(layout1)
win2_active = False
while True:
(ev1, vals1) = win1.Read()
if ev1 == 'Settings':
win2_active = True
layout2 = [
[sg.Checkbox('Rename file?',key='rename', size=(15,1)),sg.Text('Split:')],
[sg.InputText()],
[sg.Button('Exit')]
]
win2 = sg.Window('Settings').Layout(layout2)
while True:
(ev2, vals2) = win2.Read()
if ev2 == 'Exit' or ev2 == None:
win2.Close()
win2_active = False
break
elif ev1 == 'Exit' or ev1 == None:
win1.Close()
break
在项目 GitHub 上发布问题已被建议作为获得此软件包支持的最佳方式。文档说布局不能重复使用,这就是为什么将它移动到循环中的原因。
我正在尝试将 pysimplegui 用作其他人的 gui 运行 我的代码。我设法创建了一个 2 window gui,其中第二个 window 供管理员使用。但是我发现如果我做几次进入和退出windows2,就会报错
以下是可能会发生错误的代码示例。单击管理>设置时将弹出第二个 window。然后,如果我要退出并再输入几次(<4 次),就会发生错误。 错误是:
File "<ipython-input-2-4e0963ff7cf8>", line 1, in <module>
runfile('C:/Python/test.py', wdir='C:/Python')
File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
execfile(filename, namespace)
File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Python/test.py", line 29, in <module>
(ev2, vals2) = win2.Read()
File "C:\ProgramData\Anaconda3\lib\site-packages\PySimpleGUI\PySimpleGUI.py", line 5284, in Read
self._Show()
File "C:\ProgramData\Anaconda3\lib\site-packages\PySimpleGUI\PySimpleGUI.py", line 5163, in _Show
return _BuildResults(self, False, self)
File "C:\ProgramData\Anaconda3\lib\site-packages\PySimpleGUI\PySimpleGUI.py", line 6754, in _BuildResults
_BuildResultsForSubform(form, initialize_only, top_level_form)
File "C:\ProgramData\Anaconda3\lib\site-packages\PySimpleGUI\PySimpleGUI.py", line 6843, in _BuildResultsForSubform
value = element.TKIntVar.get()
File "C:\ProgramData\Anaconda3\lib\tkinter\__init__.py", line 506, in get
value = self._tk.globalgetvar(self._name)
TclError: can't read "PY_VAR60": no such variable
其中 "PY_VAR60" 中的数字“60”可以更改为任意数字。
import PySimpleGUI as sg
menu_def= [['&Admin',['&Settings','&About']]]
layout1=[
[sg.Menu(menu_def)],
[sg.Text('Input WaferID:', size=(12, 1), font=('Calibri',15))],
[sg.Button('Exit')]
]
layout2 = [
[sg.Checkbox('Rename file?',key='rename', size=(15,1)),sg.Text('Split:')],
[sg.InputText()],
[sg.Button('Exit')]
]
win1 = sg.Window('Oxidation Object Detection V1.0').Layout(layout1)
win2_active = False
while True:
(ev1, vals1) = win1.Read()
if ev1 == 'Settings':
win2_active = True
win2 = sg.Window('Settings').Layout(layout2)
while True:
(ev2, vals2) = win2.Read()
if ev2 == 'Exit' or ev2 == None:
win2.Close()
win2_active = False
break
elif ev1 == 'Exit' or ev1 == None:
win1.Close()
break
我试过用sg.InputText替换window2的复选框,不会有错误。使用复选框时有什么我想念的吗? 谢谢。
我查看了代码,并自己尝试了,但没有使用变量 'PY_VAR60' 或数字 60。错误 - TclError: can't read "PY_VAR60": no such variable - 建议您需要在某处定义该变量,除非您在其他代码中的其他地方完成了该操作。
希望对您有所帮助。
在查看了更多示例后,我想我找到了答案。 "layout 2" 似乎必须放在 "win2_active = True" 之后。我试了几次打开和退出都没有错误。有人知道为什么吗? 更正后的代码如下:
import PySimpleGUI as sg
menu_def= [['&Admin',['&Settings','&About']]]
layout1=[
[sg.Menu(menu_def)],
[sg.Text('Input WaferID:', size=(12, 1), font=('Calibri',15))],
[sg.Button('Exit')]
]
win1 = sg.Window('Oxidation Object Detection V1.0').Layout(layout1)
win2_active = False
while True:
(ev1, vals1) = win1.Read()
if ev1 == 'Settings':
win2_active = True
layout2 = [
[sg.Checkbox('Rename file?',key='rename', size=(15,1)),sg.Text('Split:')],
[sg.InputText()],
[sg.Button('Exit')]
]
win2 = sg.Window('Settings').Layout(layout2)
while True:
(ev2, vals2) = win2.Read()
if ev2 == 'Exit' or ev2 == None:
win2.Close()
win2_active = False
break
elif ev1 == 'Exit' or ev1 == None:
win1.Close()
break
在项目 GitHub 上发布问题已被建议作为获得此软件包支持的最佳方式。文档说布局不能重复使用,这就是为什么将它移动到循环中的原因。