Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止wxpython中的gui冻结?_Python_Multithreading_Wxpython - Fatal编程技术网

如何防止wxpython中的gui冻结?

如何防止wxpython中的gui冻结?,python,multithreading,wxpython,Python,Multithreading,Wxpython,[问题] 如果我单击触发函数的按钮,gui将冻结,直到函数结束 [代码] import wx app = wx.App(redirect=False) top = wx.Frame(None) top.Maximize(True) # Set to maximize the application sizer = wx.GridBagSizer() def testFunction(event): import pyautogui import time pyautog

[问题] 如果我单击触发函数的按钮,gui将冻结,直到函数结束

[代码]

import wx
app = wx.App(redirect=False)
top = wx.Frame(None)
top.Maximize(True) # Set to maximize the application
sizer = wx.GridBagSizer()

def testFunction(event):
    import pyautogui
    import time
    pyautogui.FAILSAFE = False
    for i in range(2):
            pyautogui.hotkey('win','r')
            time.sleep (0.5)
            pyautogui.typewrite('cmd.exe')
            time.sleep (0.5)
            pyautogui.hotkey('enter')
            time.sleep (0.5)
            time.sleep (3)


addButton = wx.Button( top, -1, "Start", style=wx.BU_EXACTFIT )
sizer.Add(addButton, (6, 8), (2, 14), wx.EXPAND)
top.Bind(wx.EVT_BUTTON, testFunction, addButton)
top.Sizer = sizer
top.Sizer.Fit(top)
top.Show()
app.MainLoop()
[当前] gui冻结,直到函数结束

[需要] gui不应冻结。 注意:我认为这与线程有关,但我不能完全理解这个概念

使用在给定时间后将调用给定可调用参数的。函数
testFunction
的结构应该更改:

def testFunction(event):
    import pyautogui
    pyautogui.FAILSAFE = False

    def step1(i):
        pyautogui.hotkey('win','r')
        wx.CallLater(500, step2, i)
    def step2(i):
        pyautogui.typewrite('cmd.exe')
        wx.CallLater(500, step3, i)
    def step3(i):
        pyautogui.hotkey('enter')
        if i <= 1:
            return
        wx.CallLater(3500, step1, i-1)

    step1(2)
def testFunction(事件):
导入pyautogui
pyautogui.FAILSAFE=False
def步骤1(i):
pyautogui.hotkey('win','r'))
wx.CallLater(500,步骤2,i)
def步骤2(i):
pyautogui.typewrite('cmd.exe')
wx.CallLater(500,步骤3,i)
def步骤3(i):
pyautogui.hotkey('enter')
如果我在给定的时间后使用哪个参数调用给定的callable。函数
testFunction
的结构应该更改:

def testFunction(event):
    import pyautogui
    pyautogui.FAILSAFE = False

    def step1(i):
        pyautogui.hotkey('win','r')
        wx.CallLater(500, step2, i)
    def step2(i):
        pyautogui.typewrite('cmd.exe')
        wx.CallLater(500, step3, i)
    def step3(i):
        pyautogui.hotkey('enter')
        if i <= 1:
            return
        wx.CallLater(3500, step1, i-1)

    step1(2)
def testFunction(事件):
导入pyautogui
pyautogui.FAILSAFE=False
def步骤1(i):
pyautogui.hotkey('win','r'))
wx.CallLater(500,步骤2,i)
def步骤2(i):
pyautogui.typewrite('cmd.exe')
wx.CallLater(500,步骤3,i)
def步骤3(i):
pyautogui.hotkey('enter')

如果我对wx不是很熟悉,但这可能会有所帮助

import wx
import threading
app = wx.App(redirect=False)
top = wx.Frame(None)
top.Maximize(True) # Set to maximize the application
sizer = wx.GridBagSizer()

def testFunction(event):
    import pyautogui
    import time
    pyautogui.FAILSAFE = False
    for i in range(2):
            pyautogui.hotkey('win','r')
            time.sleep (0.5)
            pyautogui.typewrite('cmd.exe')
            time.sleep (0.5)
            pyautogui.hotkey('enter')
            time.sleep (0.5)
            time.sleep (3)

t1 = threading.Thread(target=testFunction, args=[])    

addButton = wx.Button( top, -1, "Start", style=wx.BU_EXACTFIT )
sizer.Add(addButton, (6, 8), (2, 14), wx.EXPAND)
top.Bind(wx.EVT_BUTTON, t1, addButton)
top.Sizer = sizer
top.Sizer.Fit(top)
top.Show()
app.MainLoop()

我对wx不是很熟悉,但这可能会有所帮助

import wx
import threading
app = wx.App(redirect=False)
top = wx.Frame(None)
top.Maximize(True) # Set to maximize the application
sizer = wx.GridBagSizer()

def testFunction(event):
    import pyautogui
    import time
    pyautogui.FAILSAFE = False
    for i in range(2):
            pyautogui.hotkey('win','r')
            time.sleep (0.5)
            pyautogui.typewrite('cmd.exe')
            time.sleep (0.5)
            pyautogui.hotkey('enter')
            time.sleep (0.5)
            time.sleep (3)

t1 = threading.Thread(target=testFunction, args=[])    

addButton = wx.Button( top, -1, "Start", style=wx.BU_EXACTFIT )
sizer.Add(addButton, (6, 8), (2, 14), wx.EXPAND)
top.Bind(wx.EVT_BUTTON, t1, addButton)
top.Sizer = sizer
top.Sizer.Fit(top)
top.Show()
app.MainLoop()

这对我来说很有用:

# -*- coding: utf-8 -*-
import wx
app = wx.App(redirect=False)
top = wx.Frame(None)
top.Maximize(False) # Set to maximize the application
sizer = wx.GridBagSizer()

def testFunction(event):
    import time
    for i in range(2):
        print ('win','r')
        time.sleep (0.5)
        print ('cmd.exe')
        time.sleep (0.5)
        print ('enter')
        time.sleep (0.5)
        print 'sleep'
        time.sleep (3)
        print u"Iteración %d".format(i+1)

def thread_start(event):
    import threading
    th = threading.Thread(target=testFunction, args=(event,))
    th.start()



addButton = wx.Button( top, -1, "Start", style=wx.BU_EXACTFIT )
sizer.Add(addButton, (6, 8), (2, 14), wx.EXPAND)
# top.Bind(wx.EVT_BUTTON, testFunction, addButton)
top.Bind(wx.EVT_BUTTON, thread_start, addButton)
top.Sizer = sizer
top.Sizer.Fit(top)
top.Show()
app.MainLoop()
您有一个非blicking gui。 您可以从这一点开始,添加输入变量(比如获取和标识线程,这样您就可以知道调用了哪个线程)


我删除了py2autogui库,因为我没有安装它(并且对于示例来说不是必需的)。

好吧,这对我来说很有用:

# -*- coding: utf-8 -*-
import wx
app = wx.App(redirect=False)
top = wx.Frame(None)
top.Maximize(False) # Set to maximize the application
sizer = wx.GridBagSizer()

def testFunction(event):
    import time
    for i in range(2):
        print ('win','r')
        time.sleep (0.5)
        print ('cmd.exe')
        time.sleep (0.5)
        print ('enter')
        time.sleep (0.5)
        print 'sleep'
        time.sleep (3)
        print u"Iteración %d".format(i+1)

def thread_start(event):
    import threading
    th = threading.Thread(target=testFunction, args=(event,))
    th.start()



addButton = wx.Button( top, -1, "Start", style=wx.BU_EXACTFIT )
sizer.Add(addButton, (6, 8), (2, 14), wx.EXPAND)
# top.Bind(wx.EVT_BUTTON, testFunction, addButton)
top.Bind(wx.EVT_BUTTON, thread_start, addButton)
top.Sizer = sizer
top.Sizer.Fit(top)
top.Show()
app.MainLoop()
您有一个非blicking gui。 您可以从这一点开始,添加输入变量(比如获取和标识线程,这样您就可以知道调用了哪个线程)


我删除了py2autogui库,因为我没有安装它(并且对于示例来说不是必需的)。

使用线程。这里有一个将它们添加到wxPython中GUI的示例:使用线程。这里有一个将它们添加到wxPython中GUI的示例:这不起作用,您正在将线程链接到事件,但是该线程何时启动?一旦线程结束,你就必须重新创建它(这不是在这里完成的)@tglaria。对我读了那篇文章,同时我也不太明白;这就是为什么我要得到一个提示来让我开始。我会再挖掘一些…这不起作用,你正在将一个线程链接到一个事件,但是这个线程什么时候开始?一旦线程结束,你就必须重新创建它(这不是在这里完成的)@tglaria。对我读了那篇文章,同时我也不太明白;这就是为什么我要得到一个提示来让我开始。我会再挖一些…这并没有真正解除GUI的阻塞你只是用
CallLater
函数替换
time.sleep
(这可能是某种计算的模拟),不是吗?@tglaria,通过调用
wx.CallLater
,控件被传递到事件循环。但它并没有保持函数运行,这听起来像是一个延迟启动的线程,不是吗?重新阅读这个问题,它适用于这个应用程序,但它不应该是非阻塞GUI的一般答案,对吗?@tglaria,在GUI程序中使用线程时应该小心。在非gui线程中执行gui操作可能会导致问题。这并不能真正解除对gui的阻止您只是用
CallLater
函数替换
time.sleep
(这可能是对某些计算的模拟),不是吗?@tglaria,通过调用
wx.CallLater
,控件被传递给事件循环。但是它不能保持函数运行,听起来像是一个延迟启动的线程,不是吗?重新阅读这个问题,它适用于这个应用程序,但它不应该是非阻塞GUI的一般答案,对吗?@tglaria,在GUI程序中使用线程时应该小心。在非gui线程中执行gui操作可能会导致问题。