我正在尝试实现项目的目标,并使用按钮将我的模块连接到窗口应用程序。我不知道到目前为止我错过了什么,但肯定有问题,因为当我的程序运行时,主框架崩溃,没有响应,Shell输出有效,但没有可能输入任何东西......我想我应该显示所有代码,因为我不完全知道部分是错误的。我使用boa构造函数来节省一些时间来创建Frames。 起始应用程序看起来像这样:
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和boty所以应用程序仍在破坏,但它冻结了,没有控制,直到我使用ctrl + C,Frame1完全不可用... 有很多东西丢失了吗? def响应循环可以这样操作吗?你能帮我解决一下吗?
答案 0 :(得分:0)
在编写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(...)
。