0

プロジェクトの目的を達成し、モジュールをボタン付きのウィンドウ アプリケーションに接続しようとしています。これまでのところ何が欠けているのかわかりませんが、プログラムの実行中にメインフレームがクラッシュし、応答がなく、シェル出力は機能しますが、何も入力する可能性がないため、何かが間違っていることは確かです...私はすべきだと思います一部が間違っていると正確にわからないため、すべてのコードを表示します。フレームを作成する時間を節約するために、boa コンストラクターを使用しました。開始アプリケーションは次のようになります。

アプリ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()

最後の部分に関しては、ここから階段が始まり、多くの問題、多くの編集、活動に費やされた多くの時間...

プログラムを実行して Webdriver ブラウザーにログオンすると、取得したい値がシェルに表示されます。

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

botloc、botx、boty を何度も印刷しているため、アプリケーションはまだ台無しになっていますが、フリーズし、ctrl + C を使用するまで制御できず、Frame1 が完全に使用できません...不足しているものはたくさんありますか? デフ応答ループはこのように操作できますか? それを修正するのを手伝ってもらえますか?

4

1 に答える 1

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

...アプリケーションに他のイベントを処理する機会を与えるためですが、代わりに a を使用して定期的wx.Timerに呼び出すことをお勧めします。driver.find_element_by_id(...)

于 2013-05-18T12:55:11.090 に答える