• <legend id='n8QNb'><style id='n8QNb'><dir id='n8QNb'><q id='n8QNb'></q></dir></style></legend>
      • <bdo id='n8QNb'></bdo><ul id='n8QNb'></ul>

      <i id='n8QNb'><tr id='n8QNb'><dt id='n8QNb'><q id='n8QNb'><span id='n8QNb'><b id='n8QNb'><form id='n8QNb'><ins id='n8QNb'></ins><ul id='n8QNb'></ul><sub id='n8QNb'></sub></form><legend id='n8QNb'></legend><bdo id='n8QNb'><pre id='n8QNb'><center id='n8QNb'></center></pre></bdo></b><th id='n8QNb'></th></span></q></dt></tr></i><div id='n8QNb'><tfoot id='n8QNb'></tfoot><dl id='n8QNb'><fieldset id='n8QNb'></fieldset></dl></div>
    1. <tfoot id='n8QNb'></tfoot>
    2. <small id='n8QNb'></small><noframes id='n8QNb'>

      1. 在GTK主循环中运行的Asyncio调用

        时间:2024-08-21

        <small id='BW5Dp'></small><noframes id='BW5Dp'>

        <i id='BW5Dp'><tr id='BW5Dp'><dt id='BW5Dp'><q id='BW5Dp'><span id='BW5Dp'><b id='BW5Dp'><form id='BW5Dp'><ins id='BW5Dp'></ins><ul id='BW5Dp'></ul><sub id='BW5Dp'></sub></form><legend id='BW5Dp'></legend><bdo id='BW5Dp'><pre id='BW5Dp'><center id='BW5Dp'></center></pre></bdo></b><th id='BW5Dp'></th></span></q></dt></tr></i><div id='BW5Dp'><tfoot id='BW5Dp'></tfoot><dl id='BW5Dp'><fieldset id='BW5Dp'></fieldset></dl></div>
          <tbody id='BW5Dp'></tbody>

          • <bdo id='BW5Dp'></bdo><ul id='BW5Dp'></ul>

                <legend id='BW5Dp'><style id='BW5Dp'><dir id='BW5Dp'><q id='BW5Dp'></q></dir></style></legend><tfoot id='BW5Dp'></tfoot>

                  本文介绍了在GTK主循环中运行的Asyncio调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  好的关于Asyncio和GTK+的问题。 如何在Gtk.main循环中运行下面的代码?例如,我搜索了一下,但没有找到任何内容。

                  #!/usr/bin/python3.4
                  
                  import asyncio
                  
                  @asyncio.coroutine
                  def client_connected_handler(client_reader, client_writer):
                      print("Connection received!")
                      client_writer.write(b'Hello')
                      while True:
                          data = yield from client_reader.read(8192)
                          if not data:
                              break
                          if 'EXIT' in data.decode():
                              print("Closing server")
                              break   
                          print(data)
                          client_writer.write(data)
                      print('Server is closed')
                  
                  
                  loop = asyncio.get_event_loop()
                  Server=asyncio.start_server(client_connected_handler, 'localhost', 2222)
                  server=loop.run_until_complete(Server)
                  loop.run_forever()
                  

                  编辑:

                  好的,我应该用gbulb写下我的经历。 首先,我使用PIP3进行了搜索。我找到了它,并试图安装它,但由于链接错误,它失败了(我正在使用超级用户进行安装)。 接下来,我从他们的存储库中下载并安装了它。我得到了这个example,我运行了它,因为他们的核心模块中缺少参数,所以出现了一些错误。我不知道是哪个错误,因为我是从不同的PC编写这篇文章的,我会尽快更新。另外,如果其他人能测试一下,我将不胜感激。

                  推荐答案

                  自2020年起,gbulb库显示为unmaintained。任何希望集成asyncio和gtk的人都应该只考虑答案的第二部分(显示asyncio在专用线程中运行)或查看asyncio-glib,它使用比gbulb更简约和健壮的方法集成了asyncio和gtk。

                  原始答案如下。


                  gbulb library旨在提供PEP3156指定的异步事件循环和Glib主循环实现之间的连接器。但是,gbulb的当前主机在随Python3.4一起提供的异步CIO中已损坏。若要解决此问题,您可以签出this fork,而不是签出主文件。(该问题稍后已在上游修复。)

                  使用有效的gbulb,修改示例以接受传入连接并运行GTK:

                  非常简单
                  #!/usr/bin/python3
                  
                  import gi
                  gi.require_version("Gtk", "3.0")
                  
                  import asyncio, gbulb
                  from gi.repository import Gtk
                  asyncio.set_event_loop_policy(gbulb.GLibEventLoopPolicy())
                  
                  @asyncio.coroutine
                  def client_connected_handler(client_reader, client_writer):
                      print("Connection received!")
                      client_writer.write(b'Hello')
                      while True:
                          data = yield from client_reader.read(8192)
                          if not data:
                              break
                          if 'EXIT' in data.decode():
                              print("Closing server")
                              break   
                          print(data)
                          client_writer.write(data)
                      print('Server is closed')
                  
                  loop = asyncio.get_event_loop()
                  loop.run_until_complete(
                      asyncio.start_server(client_connected_handler, 'localhost', 2222))
                  
                  w = Gtk.Window()
                  w.add(Gtk.Label('hey!'))
                  w.connect('destroy', Gtk.main_quit)
                  w.show_all()
                  
                  loop.run_forever()
                  

                  另一种可能是在不同的线程中运行异步事件循环:

                  #!/usr/bin/python3
                  
                  import asyncio, threading
                  
                  import gi
                  gi.require_version("Gtk", "3.0")
                  
                  from gi.repository import Gtk
                  
                  async def client_connected_handler(client_reader, client_writer):
                      # ... unchanged ...
                  
                  def run_asyncio():
                      loop = asyncio.new_event_loop()
                      asyncio.set_event_loop(loop)
                      loop.run_until_complete(
                          asyncio.start_server(client_connected_handler, 'localhost', 2222))
                      loop.run_forever()
                  
                  threading.Thread(target=run_asyncio).start()
                  
                  w = Gtk.Window()
                  w.add(Gtk.Label('hey!'))
                  w.connect('destroy', Gtk.main_quit)
                  w.show_all()
                  
                  Gtk.main()
                  

                  这样做的好处是根本不需要gbulb(不清楚gbulb在生产中测试得有多好)。但是,使用线程安全函数在GUI(主)线程和异步线程之间通信时需要小心。这意味着使用loop.call_soon_threadsafeasyncio.run_coroutine_threadsafe从GTK向Asyncio提交内容,使用GLib.idle_add从Asyncio向GTK提交内容。

                  这篇关于在GTK主循环中运行的Asyncio调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:如何在VScode和PyCharm这样的PyGtk应用中实现Linux终端? 下一篇:GTK焦点链

                  相关文章

                • <small id='sZACq'></small><noframes id='sZACq'>

                  <legend id='sZACq'><style id='sZACq'><dir id='sZACq'><q id='sZACq'></q></dir></style></legend>
                  <i id='sZACq'><tr id='sZACq'><dt id='sZACq'><q id='sZACq'><span id='sZACq'><b id='sZACq'><form id='sZACq'><ins id='sZACq'></ins><ul id='sZACq'></ul><sub id='sZACq'></sub></form><legend id='sZACq'></legend><bdo id='sZACq'><pre id='sZACq'><center id='sZACq'></center></pre></bdo></b><th id='sZACq'></th></span></q></dt></tr></i><div id='sZACq'><tfoot id='sZACq'></tfoot><dl id='sZACq'><fieldset id='sZACq'></fieldset></dl></div>

                  1. <tfoot id='sZACq'></tfoot>
                        <bdo id='sZACq'></bdo><ul id='sZACq'></ul>