错误的结构或者循环崩溃



我正在努力实现我的项目的目标,并将我的模块连接到窗口应用程序与按钮。我不知道到目前为止我错过了什么,但肯定有些东西是错误的,因为当我的程序运行时,主框架崩溃了,没有响应,Shell输出工作,但没有可能输入任何东西…我想我应该给你看所有的代码,因为我不知道哪一部分是错的。我使用boa构造函数来节省创建frame的时间。开始的应用程序看起来像这样:

App1:

import wx
import Frame1
modules ={'Frame1': [1, 'Main frame of Application', u'Frame1.py'],
 u'botcordxy': [0, u'x, y values', u'botcordxy.py']}
class BoaApp(wx.App):
    def OnInit(self):
        self.main = Frame1.create(None)
        self.main.Show()
        self.SetTopWindow(self.main)
        return True
def main():
    application = BoaApp(0)
    application.MainLoop()
if __name__ == '__main__':
    main()

我不确定,但我认为以上内容是正确的,如果不是,请告诉我。

Frame1.py:

import wx
def create(parent):
    return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1BUTTON1, wxID_FRAME1PANEL1, 
] = [wx.NewId() for _init_ctrls in range(3)]
class Frame1(wx.Frame):
    def _init_ctrls(self, prnt):
        wx.Frame.__init__(self, id=wxID_FRAME1, name=u'Frame1', parent=prnt,
              pos=wx.Point(-1, 291), size=wx.Size(250, 480),
              style=wx.DEFAULT_FRAME_STYLE, title=u'ZulithBot')
        self.SetClientSize(wx.Size(242, 446))
        self.Bind(wx.EVT_BUTTON, self.Firefox, id=wxID_FRAME1BUTTON1)
        self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1, name='panel1', parent=self,
              pos=wx.Point(0, 0), size=wx.Size(242, 446),
              style=wx.TAB_TRAVERSAL)
        self.button1 = wx.Button(id=wxID_FRAME1BUTTON1,
              label=u'Start Firefox', name='button1', parent=self.panel1,
              pos=wx.Point(80, 24), size=wx.Size(88, 23), style=0)
    def Firefox(self, event):
        import botcordxy
    def __init__(self, parent):
        self._init_ctrls(parent)

最后一个:

botcordxy.py

import selenium
from selenium import webdriver
import time
##The name of website has been changed just in care.
driver = webdriver.Firefox()
driver.get('http://example.com//')
def repeat():
    while 1 == 1:
        botloc = driver.find_element_by_id('botloc').text
        botX,botY = map(int,botloc.split(','))
        print botX
        print botY
        print botloc
def checker():
    if driver.current_url == 'http://logged.example.com//':
        repeat()
    else:
        time.sleep(5)
        checker()
checker()

至于最后一部分,这里开始了楼梯,很多问题,很多编辑,大量的时间投入到活动中……

当我运行程序并登录Webdriver浏览器时,Shell显示了我想要得到的值:

32
59
32,59
31
59
31,59
31
58
31,58

一遍又一遍地打印botloc, botx和body,所以应用程序仍然在破坏,但它冻结了,没有控制,直到我使用ctrl + C, Frame1完全不可用…是不是有很多东西被遗漏了?Def响应循环可以这样操作吗?你能帮我修一下吗?

在编写wxPython应用程序时,您必须确保您定义的任何事件处理函数都能相当快地返回,否则应用程序将无法处理任何其他事件,例如重新绘制框架,并且您的程序将变得无响应。

问题是这个事件处理程序…

def Firefox(self, event):
    import botcordxy

…最终导致这个无限循环运行…

while 1 == 1:
    botloc = driver.find_element_by_id('botloc').text
    botX,botY = map(int,botloc.split(','))
    print botX
    print botY
    print botloc

…因此,控制将永远不会返回到主事件循环,并且主框架将看起来被冻结。

一个快速的解决方案是使用wx.Yield()暂时将控制权交给循环中的事件处理程序,像这样…

import wx
while 1 == 1:
    botloc = driver.find_element_by_id('botloc').text
    botX,botY = map(int,botloc.split(','))
    print botX
    print botY
    print botloc
    wx.Yield()

…让应用程序有机会处理其他事件,但是您最好使用wx.Timer定期调用driver.find_element_by_id(...)

相关内容

  • 没有找到相关文章

最新更新