如何从另一个模块修改 Python 中的 WebKit 或向 WebKit 发送信号?
How do I modify or send signals to WebKit in Python from another module?
我是 Python 的新手,没有面向对象的背景。更糟糕的是,我希望能够执行 Stuff(),因此我正在使用大量在线资源,包括非常有用的 'Learn Python the Hard Way,' 来尝试获取概念和实践。我真的可以在目前超出我能力范围的项目中使用一些指导。
我正在尝试构建一个使用 WebKitGTK 启动浏览器会话并运行一个小型监听守护进程的程序。我想向服务器发送信号,服务器通过 Telnet 将命令中继到 WebKit 实例……目前,页面刷新就足够了。我需要它是非阻塞的,所以,通过大量的阅读和犯规,这就是我所拥有的:
main.py:
- 使用多处理模块启动监听服务器
- 启动浏览器显示
server.py:
- 运行在端口上侦听 Telnet 连接的服务器。 'while' 循环是我想处理收到的命令的地方。
display.py:
- 创建并运行 Webkit 实例
我的问题:
如何在 'server.py?' 中引用 WebKit 实例 我尝试创建一个定义 GTK/WebKit 对象的全局模块,然后在 'server.listener,' 中访问但我迷路了如何向此发送信号。
我知道这不简洁或高效,但我的代码如下。感谢您为我指明正确的方向。
############################
# main.py
############################
import multiprocessing
import server
import display
if __name__ == '__main__':
serv = multiprocessing.Process(name='serverproc', target=server.listener)
serv.start()
display.browser()
############################
# server.py
############################
import socket
import sys
import gtk
def listener():
HOST = ''
PORT = 8089
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
sock.bind((HOST, PORT))
except socket.error as msg:
print 'Failed to bind. Error: ' + str(msg[0]) + ' Message ' + msg[1]
sys.exit()
print 'Socket bound'
sock.listen(10)
print 'Socket listening'
while True:
conn, address = sock.accept()
print 'Connected with ' + address[0] + ':' + str(address[1])
data = conn.recv(64).strip()
print 'Received: ' + data + '\n'
if not data:
break
'''
This is where I'd like to be able to send a page refresh signal to the
Webkit instance:
'''
if data == 'restart':
print 'Attempting to restart'
break
conn.close()
conn.close()
sock.close()
############################
# display.py
############################
import gtk
import webkit
import gtk.gdk as GDK
def browser():
width = 500
height = 800
w = gtk.Window()
w.connect("destroy", gtk.main_quit)
w.set_title("Browser")
w.resize(width,height)
w.set_keep_above(True)
w.set_decorated(False)
client = webkit.WebView()
client.open('http://127.0.0.1/index.php')
client.set_editable(False)
client.set_size_request(width, height)
w.add(client)
w.show_all()
gtk.main()
更新:
好的,我将所有内容都放在一个模块中并创建了一个 class、"Display,",其中包含“init”和 'server' 方法.当我将 'hello' 传递给服务器时,它会打印一个显示对象地址 ("Display object at 0x7f20e18a7c80 [GtkWindow at 0x23850e0]"),但我不明白为什么 URL 在 webkit 实例中实际上没有改变。有人可以帮忙吗?这是我更新的代码:
############################
# display.py
############################
import os
import gtk, gobject
import webkit
import socket
import multiprocessing
# ================================================= #
class Display(gtk.Window):
def __init__(self):
w = 600
h = 800
gtk.Window.__init__(self)
self.set_default_size(w, h)
self.browser = webkit.WebView()
self.browser.set_size_request(w, h)
self.add(self.browser)
self.connect('destroy', gtk.main_quit)
self.browser.open('http://127.0.0.1/index.php')
self.show_all()
def server(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('127.0.0.1', 8089))
sock.listen(5)
while True:
conn, address = sock.accept()
data = conn.recv(64).strip()
if data == 'hello':
print self
self.browser.open('http://127.0.0.1/newpage.php')
conn.close()
conn.close()
sock.close()
# ================================================= #
if __name__ == "__main__":
b = Display()
serv = multiprocessing.Process(name='serverproc', target=b.server)
serv.start()
gtk.main()
解决方案:
为了完成,这里是完整的解决方案(是的,我在 Python 2.7.9)。
############################
# display.py
############################
import os
import gtk, gobject
import webkit
import socket
import glib
import threading
# ================================================= #
class Display(gtk.Window):
def __init__(self):
w = 600
h = 800
gtk.Window.__init__(self)
self.set_default_size(w, h)
self.browser = webkit.WebView()
self.browser.set_size_request(w, h)
self.add(self.browser)
self.connect('destroy', gtk.main_quit)
self.browser.open('http://127.0.0.1/index.php')
self.show_all()
def server(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('127.0.0.1', 8089))
sock.listen(5)
while True:
conn, address = sock.accept()
data = conn.recv(64).strip()
if data == 'hello':
print self
glib.idle_add(self.browser.open, 'http://127.0.0.1/newpage.php')
conn.close()
conn.close()
sock.close()
# ================================================= #
if __name__ == "__main__":
b = Display()
serv = threading.Thread(name='serverproc', target=b.server)
serv.start()
gtk.main()
您可以使用 class 为 window(classes 通常对于实现 GUI 非常有用)和 运行 服务器建模。因此,可以使用python的threading.Thread
。从线程修改 Gtk 小部件时,您仍然需要注意。 Gtk 有它自己的机制。你可以简单地使用 GLib.idle_add()
并且你不会 运行 陷入并发修改引起的问题。
(工作结果在编辑的问题中可见。)
我是 Python 的新手,没有面向对象的背景。更糟糕的是,我希望能够执行 Stuff(),因此我正在使用大量在线资源,包括非常有用的 'Learn Python the Hard Way,' 来尝试获取概念和实践。我真的可以在目前超出我能力范围的项目中使用一些指导。
我正在尝试构建一个使用 WebKitGTK 启动浏览器会话并运行一个小型监听守护进程的程序。我想向服务器发送信号,服务器通过 Telnet 将命令中继到 WebKit 实例……目前,页面刷新就足够了。我需要它是非阻塞的,所以,通过大量的阅读和犯规,这就是我所拥有的:
main.py: - 使用多处理模块启动监听服务器 - 启动浏览器显示
server.py: - 运行在端口上侦听 Telnet 连接的服务器。 'while' 循环是我想处理收到的命令的地方。
display.py: - 创建并运行 Webkit 实例
我的问题:
如何在 'server.py?' 中引用 WebKit 实例 我尝试创建一个定义 GTK/WebKit 对象的全局模块,然后在 'server.listener,' 中访问但我迷路了如何向此发送信号。
我知道这不简洁或高效,但我的代码如下。感谢您为我指明正确的方向。
############################
# main.py
############################
import multiprocessing
import server
import display
if __name__ == '__main__':
serv = multiprocessing.Process(name='serverproc', target=server.listener)
serv.start()
display.browser()
############################
# server.py
############################
import socket
import sys
import gtk
def listener():
HOST = ''
PORT = 8089
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
sock.bind((HOST, PORT))
except socket.error as msg:
print 'Failed to bind. Error: ' + str(msg[0]) + ' Message ' + msg[1]
sys.exit()
print 'Socket bound'
sock.listen(10)
print 'Socket listening'
while True:
conn, address = sock.accept()
print 'Connected with ' + address[0] + ':' + str(address[1])
data = conn.recv(64).strip()
print 'Received: ' + data + '\n'
if not data:
break
'''
This is where I'd like to be able to send a page refresh signal to the
Webkit instance:
'''
if data == 'restart':
print 'Attempting to restart'
break
conn.close()
conn.close()
sock.close()
############################
# display.py
############################
import gtk
import webkit
import gtk.gdk as GDK
def browser():
width = 500
height = 800
w = gtk.Window()
w.connect("destroy", gtk.main_quit)
w.set_title("Browser")
w.resize(width,height)
w.set_keep_above(True)
w.set_decorated(False)
client = webkit.WebView()
client.open('http://127.0.0.1/index.php')
client.set_editable(False)
client.set_size_request(width, height)
w.add(client)
w.show_all()
gtk.main()
更新:
好的,我将所有内容都放在一个模块中并创建了一个 class、"Display,",其中包含“init”和 'server' 方法.当我将 'hello' 传递给服务器时,它会打印一个显示对象地址 ("Display object at 0x7f20e18a7c80 [GtkWindow at 0x23850e0]"),但我不明白为什么 URL 在 webkit 实例中实际上没有改变。有人可以帮忙吗?这是我更新的代码:
############################
# display.py
############################
import os
import gtk, gobject
import webkit
import socket
import multiprocessing
# ================================================= #
class Display(gtk.Window):
def __init__(self):
w = 600
h = 800
gtk.Window.__init__(self)
self.set_default_size(w, h)
self.browser = webkit.WebView()
self.browser.set_size_request(w, h)
self.add(self.browser)
self.connect('destroy', gtk.main_quit)
self.browser.open('http://127.0.0.1/index.php')
self.show_all()
def server(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('127.0.0.1', 8089))
sock.listen(5)
while True:
conn, address = sock.accept()
data = conn.recv(64).strip()
if data == 'hello':
print self
self.browser.open('http://127.0.0.1/newpage.php')
conn.close()
conn.close()
sock.close()
# ================================================= #
if __name__ == "__main__":
b = Display()
serv = multiprocessing.Process(name='serverproc', target=b.server)
serv.start()
gtk.main()
解决方案:
为了完成,这里是完整的解决方案(是的,我在 Python 2.7.9)。
############################
# display.py
############################
import os
import gtk, gobject
import webkit
import socket
import glib
import threading
# ================================================= #
class Display(gtk.Window):
def __init__(self):
w = 600
h = 800
gtk.Window.__init__(self)
self.set_default_size(w, h)
self.browser = webkit.WebView()
self.browser.set_size_request(w, h)
self.add(self.browser)
self.connect('destroy', gtk.main_quit)
self.browser.open('http://127.0.0.1/index.php')
self.show_all()
def server(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('127.0.0.1', 8089))
sock.listen(5)
while True:
conn, address = sock.accept()
data = conn.recv(64).strip()
if data == 'hello':
print self
glib.idle_add(self.browser.open, 'http://127.0.0.1/newpage.php')
conn.close()
conn.close()
sock.close()
# ================================================= #
if __name__ == "__main__":
b = Display()
serv = threading.Thread(name='serverproc', target=b.server)
serv.start()
gtk.main()
您可以使用 class 为 window(classes 通常对于实现 GUI 非常有用)和 运行 服务器建模。因此,可以使用python的threading.Thread
。从线程修改 Gtk 小部件时,您仍然需要注意。 Gtk 有它自己的机制。你可以简单地使用 GLib.idle_add()
并且你不会 运行 陷入并发修改引起的问题。
(工作结果在编辑的问题中可见。)