0

我正在尝试 pysimplegui 将其用作其他人运行我的代码的 gui。我设法创建了一个 2 窗口 gui,其中第二个窗口供管理员使用。但是我发现如果我要多次进入和退出windows 2,就会出现错误。

下面是会发生错误的代码示例。单击管理>设置时,将弹出第二个窗口。然后,如果我要退出并再输入几次(<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 替换窗口 2 的复选框,不会有错误。使用复选框时有什么我想念的吗?谢谢你。

4

3 回答 3

0

我查看了代码,并亲自试了一下,但变量“PY_VAR60”或使用的数字 60 无处可寻。错误 - TclError: can't read "PY_VAR60": no such variable - 表明您需要在某个地方定义它,除非您在其他代码中的其他地方完成了该操作。

希望这有帮助。

于 2019-08-27T06:57:26.083 回答
0

在查看了更多示例后,我想我找到了答案。似乎“布局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
于 2019-08-27T07:47:41.473 回答
0

建议在项目的 GitHub 上发布问题作为获得此包支持的最佳方式。文档说布局不能被重复使用,这就是为什么在循环内移动它的原因。

于 2019-08-27T18:10:15.333 回答