2013-05-18 8 views
0

내 프로젝트의 목표를 달성하고 모듈을 창 응용 프로그램에 단추로 연결하려고합니다. 지금까지 누락 된 것이 무엇인지 모르겠지만 뭔가 잘못되었습니다. 프로그램이 실행 중일 때 메인 프레임이 충돌하고 응답이 없으므로 Shell 출력이 작동하지만 아무것도 입력 할 수 없기 때문에 ... 내가 정확히 부분을 잘못 알고 있기 때문에 당신에게 모든 코드를 보여줍니다. 보아 생성자를 사용하여 프레임을 만드는 시간을 절약했습니다. 출발 응용 프로그램이 해당 같습니다잘못 제작되었거나 루프가 비정상 종료 되었습니까?

앱 1 :

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() 

, 여기에 계단, 많은 문제를 시작했다 , 많은 편집, 활동에 많은 시간을 바쳤습니다 ...

프로그램을 실행하고 로그온 할 때 bdriver 브라우저는 다음 쉘 내가 얻을 원하는 값을 보여줍니다

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

를 통해 응용 프로그램이 여전히 파괴되도록 이상 botloc, botx 및 boty 인쇄되어 있지만 냉동, 통제는 내가 사용하지까지 ctrl + C, Frame1 완전히 사용할 수 없습니다 ... 누락 된 많은 것들이 있습니까? def 응답 루프는이 방법으로 작동 될 수 있습니까? 그 문제를 해결하도록 도와 주시겠습니까?

답변

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 

...이 이벤트 핸들러입니다 ... 그래서 컨트롤에 반환하지 않습니다 메인 이벤트 루프 및 메인 프레임이 정지 된 것처럼 보입니다.

빠른 앤 더러운 솔루션은 응용 프로그램을 다른 처리를 할 수있는 기회를 제공하기 위해 ...

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.Yield()와 루프 내부의 이벤트 핸들러로 제어를 산출하는 것 이벤트가 있지만 driver.find_element_by_id(...) 번으로 전화 하시려면 wx.Timer을 정기적으로 사용하시는 것이 좋습니다.

+0

대단히 감사합니다. 그리고 wx.Timer에 대해서 wx.Timer로 다음과 같이 만들 수 있습니다 : if key_pressed_arrowup : div에서 botloc을 다시 업데이트 하시겠습니까? – Mezulith

+0

@Mezulith 글쎄, 키를 누를 때마다 한 번만 업데이트를 원한다면 타이머가 필요하지 않습니다.여러분이하려고하는 것이 무엇인지는 명확하지 않지만, 일단'botloc'의 정확한 값을 얻었 으면'while' 루프에서 빠져 나올 무언가가 필요합니다. – Aya

+0

내가 말하고자하는 바에는 completly 동의하지 않는다. wx.Timer와 Break는 내가 필요로하는 것이 무엇인가에 기반을 두어야한다. 만약 botloc = 마지막 botloc이 깨진다면, 확실치 않지만 botloc 값으로 저장소를 생성해야한다고 생각한다. , 화살표 키를 누른 후 이벤트를 다시 시작하십시오. 그러나 이상한 것은'botX, botY = map (int, botloc.split (','))ValueError : 기수 10 인 int()에 대한 리터럴이 잘못되었습니다. : '''그리고 수동으로 쉘에서 repeat()를 실행해야합니다. 어떻게 수정해야합니까? – Mezulith