PySimpleGUI RuntimeError: เธรดหลักไม่ได้อยู่ในลูปหลัก


0

ในฐานะผู้เรียนของ Python ฉันตัดสินใจลอง PySimpleGUI และเขียนสคริปต์ที่มีส่วนย่อยที่เกี่ยวข้องคือ

`    
import PySimpleGUI as sg 
....
window = sg.Window('Output Filename Creator').Layout(layout)
while True:
    event, values = window.Read()
    if event is None  or event == "Cancel":
        window.Close()
        sys.exit()
    else:
        outfile = values['file']
        window.Close()
        return outfile    `  

ฉันใช้ Windows 10, Python 3.7, Idle 3.7 และ PySimpleGUI-3.24.0 หลังจากรันสคริปต์ที่มีข้อมูลโค้ดด้านบน (ไม่มีข้อผิดพลาดในการดำเนินการ) ฉันไปที่เชลล์ Idle แล้วลองพิมพ์ len ('1') เมื่อเข้าสู่วงเล็บเปิดข้อผิดพลาดต่อไปนี้จะถูกสร้างขึ้น:

Traceback (most recent call last): File "C:\Users\Paul\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 332, in __del__ if self._tk.getboolean(self._tk.call("info", "exists", self._name)): RuntimeError: main thread is not in main loop

ฉันรู้ว่า PySimpleGUI อยู่บนพื้นฐานของ tkinter แต่นั่นก็เท่าที่ความรู้ของฉันไป ฉันไม่รู้ว่าเธรดทำงานอย่างไรใน Python หรือ PySimpleGUI เชื่อมโยงกับ Tk ได้อย่างไร แต่ฉันต้องการทราบว่าข้อผิดพลาดมาจากที่ใดและฉันสามารถทำอะไรได้บ้างเพื่อหลีกเลี่ยง

อัปเดต: รหัสที่ลดลงเป็นสิ่งจำเป็นเปลือยยังคงให้ข้อผิดพลาดเดิมเมื่อปิดหน้าต่างโดยคลิกที่กากบาทที่มุมขวาบน:

def OutputFileName(default):
    import PySimpleGUI as sg      

    layout = [
              [sg.In(default, key='file', size=(70,1)),
               sg.SaveAs('Browse')],
              [sg.Save(), sg.Text(' '*35), sg.Cancel()]
            ]

    window = sg.Window(' ').Layout(layout)
    event, values = window.Read()
    if event is None or event == "Cancel":
        return
    elif event == 'Save':
        return values['file']
outf = OutputFileName('foo.txt')

ดูเหมือนว่าคุณไม่สามารถไปในวงเป็นครั้งที่สองในขณะที่ทั้งสองสาขาของif statementคุณออกจากวงดังนั้นจึงจำเป็นที่จะต้องwhile True:?
gkivanov

เอกสาร PySimpleGUI ทำให้ฉันประทับใจว่าคุณต้องวนซ้ำเหตุการณ์ต่างๆเช่นการกดแป้นพิมพ์ อย่างไรก็ตามฉันเอาลูปออกแล้วยังเกิดข้อผิดพลาดขึ้น
P. Wormer

นอกจากความคิดเห็นก่อนหน้าของฉัน: ฉันได้แก้ไขตัวอย่างที่ sg.Window () ถูกเรียกด้วยอาร์กิวเมนต์ 'return_keyboard_events = True' ฉันมองข้ามการโต้แย้งนี้และไม่ได้รวมการวนลูปไม่มีที่สิ้นสุด
P. Wormer

ลบออกwindow.Close()จากwhile True:วง ติดตามรูปแบบนี้แบบถาวร - หน้าต่าง - หลายคนอ่านโดยใช้
-aan

เอาออก () ออกจากวง (สองครั้ง) เพิ่ม 'do_not_clear = True' เป็น In (... ) เหมือนในลิงก์ ปัญหายังคงมีอยู่
P. Wormer

คำตอบ:


0

ปัญหานี้เกิดจาก IDLE ถูกเขียนโดยใช้ tkinter

tkinter เป็นเรื่องเกี่ยวกับทรัพยากรและเธรด มีคำเตือนในเอกสาร PySimpleGUI เกี่ยวกับการใช้ PySimpleGUI ในสภาพแวดล้อมแบบเธรดเนื่องจากคุณสามารถเข้าสู่สถานการณ์เช่นนี้ที่ทรัพยากรถูกปลดปล่อยในเธรดที่ไม่ถูกต้องหรือ tkinter ทำให้สับสนว่าใครกำลังใช้งาน mainloop

นี่คือโพสต์เก่าที่พูดคุยเกี่ยวกับปัญหาในการใช้หลาย mainloops เมื่อใช้ IDLE

https://groups.google.com/forum/#!topic/comp.lang.python/kr7lKj4qMl4

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.