Найти - Пользователи
Полная версия: PySimpleGUI зависает
Начало » GUI » PySimpleGUI зависает
1
vr
простейший пример
 import PySimpleGUI as sg
layout = [
    [sg.Cancel(),sg.Button('test')]
    ]
window = sg.Window('Test.py', layout)
while True:
    event, values = window.read()
    if event in (None, 'stop'):
        break
    if event == 'test' :
        for i in range(300):
            print(i)
жму тест и интерфейс намертво повисает пока она не выполнит задачу взаимодействовать с интерфейсом никак нельзя.
может я что то делаю не так ? в таком случае как правильно?
или это минус конкретно этой библиотеки и с этим ничего не поделаешь?
в крайнем случае стоит ли мне попробовать другие GUI или результат будет тем же?
vr
проверил в tkinter та же беда
можно как то сделать интерфейс который будет запускать скрипт и при этом не зависать намертво до его завершения ?
py.user.next
vr
в таком случае как правильно?
Для этого делаются потоки. В одном потоке у тебя окно, в другом потоке запускается выполнение чего-нибудь.

vr
в крайнем случае стоит ли мне попробовать другие GUI или результат будет тем же?
Придётся учиться делать потоки. Потоки - это threads.
vr
к такой мысли я сразу и пришел, но после нескольких попыток понял что либо я где то косячу и создаю поток внутри потока либо это так не работает
vr
угу сейчас с утра зааметил что я так и делал. ну что то до меня никак не дойдет озарение как их розделить
 import PySimpleGUI as sg #vizyal GUI
import threading
import time
class testth(threading.Thread):
    def __init__(self, name, counter):
        threading.Thread.__init__(self)
        self.threadID = counter
        self.name = name
        self.counter = counter
    def run(self):
        for i in range(150):
            print(i)
class win(threading.Thread):
    def __init__(self, name, counter):
        threading.Thread.__init__(self)
        self.threadID = counter
        self.name = name
        self.counter = counter
    def run(self):
        print ('Window open')
        layout = [
            [sg.Text('var'), sg.InputText()],
            [sg.Cancel(), sg.Button('knopka1'), sg.Button('test'), sg.Button('Start test th')]
            ]
        window = sg.Window('Program', layout)
        global eve
        global values
        while True :
            event, values = window.read()
            if event in (None, 'Stop') :
                break
            if event == 'knopka1' :
                print ('najal')
                eve = 'Start skript'
                test()
            if event == 'test' :
                eve = 'stop'
                print (eve)
                test()
            if event == 'Start test th' :
                print ('Start test th')
                eve = 'Start test th'
                test()
                
global eve
eve = 'Start th'
def test() :
    global eve
    while True:
        print ('...')
        if eve == 'Start th' :
            thread0 = win('Thread0', 0)
            thread0.start()
            thread0.join()
            
            eve = 'not start'
        if eve == 'stop' :
            break
        if eve == 'Start skript' :
            for i in range(100) :
                print (i)
            break
        if eve == 'Start test th' :
            thread1 = testth('Thread1', 1)
            thread1.start()
            thread1.join()
            break
        break
test()
vr
py.user.next
Придётся учиться делать потоки. Потоки - это threads

спасибо за помощь, я понял что делал не так, а то вчера уже полез в субпроцесы потому что подумал что потоками интерфейс и скрипт разделить не выйдет)
нужно было убрать thread0.join()
в итоге ответ такой:
 import PySimpleGUI as sg 
import threading
class win(threading.Thread):
    def __init__(self, name, counter):
        threading.Thread.__init__(self)
        self.threadID = counter
        self.name = name
        self.counter = counter
    def run(self):
        layout = [
             [sg.Cancel(),sg.Button('test'), sg.Button('start')]
            ]
        window = sg.Window('Test.py', layout)
        while True:
            event, values = window.read()
            if event in (None, 'stop'):
                break
            if event == 'start' :
                thread1 = st('Thread1', 1)
                thread1.start()
class st(threading.Thread):
    def __init__(self, name, counter):
        threading.Thread.__init__(self)
        self.threadID = counter
        self.name = name
        self.counter = counter
    def run(self):
        for i in range(150):
            print(i)
thread0 = win('Thread0', 0)
thread0.start()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB