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

      3. <small id='eDw44'></small><noframes id='eDw44'>

      4. 如何同时运行 kivy 和烧瓶应用程序?

        时间:2023-10-10

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

        • <tfoot id='NHht8'></tfoot>
            <tbody id='NHht8'></tbody>

          • <legend id='NHht8'><style id='NHht8'><dir id='NHht8'><q id='NHht8'></q></dir></style></legend>

                <bdo id='NHht8'></bdo><ul id='NHht8'></ul>
                <i id='NHht8'><tr id='NHht8'><dt id='NHht8'><q id='NHht8'><span id='NHht8'><b id='NHht8'><form id='NHht8'><ins id='NHht8'></ins><ul id='NHht8'></ul><sub id='NHht8'></sub></form><legend id='NHht8'></legend><bdo id='NHht8'><pre id='NHht8'><center id='NHht8'></center></pre></bdo></b><th id='NHht8'></th></span></q></dt></tr></i><div id='NHht8'><tfoot id='NHht8'></tfoot><dl id='NHht8'><fieldset id='NHht8'></fieldset></dl></div>
                1. 本文介绍了如何同时运行 kivy 和烧瓶应用程序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  我有一个烧瓶应用程序作为服务器,我有一个 kivy 应用程序作为服务器的前端.如何运行烧瓶然后运行 ​​kivy 应用程序以便它们同时协同工作?

                  I have a flask app serving as a server and I have a kivy app serving as a front end to a server. How can I run flask and then kivy app so they work together at the same time?

                  Flask 应用:

                  from flask import Flask
                  
                  app = Flask(__name__)
                  
                  
                  @app.route('/')
                  def hello():
                      return 'Hello'
                  
                  if __name__ == "__main__":
                      app.run()
                  

                  Kivy 应用:

                  from kivy.app import App
                  from kivy.builder import Builder
                  from kivy.uix.screenmanager import Screen, ScreenManager
                  kivy.require('1.10.0')
                  
                  Builder.load_file('kivy.kv')
                  
                  sm = ScreenManager()
                  
                  class MainScreen(Screen)
                      pass
                  
                  class OtherScreen(Screen)
                      pass
                  
                  sm.add_widget(MainScreen(name='main'))
                  sm.add_widget(OtherScreen(name='other'))
                  
                  class MyApp(App):
                      def build(self):
                          return sm
                  
                  
                  MyApp().run()
                  

                  更新:如果有人在使用 apache 实现网络服务器时遇到问题,请尝试 docker,我认为这是一种更简单、更快的解决方案!

                  Update: If someone is having problems implementing a webserver with apache, try docker, simpler and faster solution, in my opinion!

                  推荐答案

                  我想让 Flask 连续运行.我尝试了建议的解决方案,按照@amanb 的建议将它们作为线程一起运行.我发现 Flask 正在阻塞 Kivy,反之亦然,无论线程的时间安排或排列方式如何.原因是解释器的 GIL.因此,我尝试了流程,似乎它确实有效.

                  I wanted Flask to run continuously. I tried the proposed solution to run them together as threads as suggested by @amanb. I found out Flask is blocking Kivy and vice versa no matter the timing or how arranged are the threads. The reason being the interpreter's GIL. Therefore I tried with processes and it seems it does the work.

                  代码

                  #!/usr/bin/python2.7 python2.7
                  # -*- coding: utf-8 -*-
                  
                  # kivy modules first, if not Kivy may cause problems
                  import kivy
                  from kivy.app import App
                  from kivy.lang import Builder
                  from kivy.uix.label import Label
                  from kivy.uix.floatlayout import FloatLayout
                  from kivy.uix.screenmanager import ScreenManager, Screen
                  kivy.require('1.10.0')
                  
                  
                  # common modules
                  import sys
                  import signal
                  from multiprocessing import Process
                  
                  
                  # Flask & similar modules
                  from flask import Flask
                  from flask_restful import reqparse, abort, Api, Resource
                  import eventlet
                  from eventlet import wsgi
                  
                  
                  # async server setup
                  app = Flask(__name__)
                  api = Api(app)
                  
                  
                  def start_Flask():
                      print("Starting server...")
                      # start an eventlet WSGI server on port 5000
                      wsgi.server(eventlet.listen(('', 5000)), app)     
                  
                  
                  def signal_handler(signal, frame):
                      # for fetching CTRL+C and relatives
                      print " CTRL + C detected, exiting ... "
                      exit(1)
                  
                  
                  # Kivy screen class
                  class MainScreen(Screen):
                      def __init__(self, **kwargs):
                          self.name="MAIN SCREEN"
                          super(Screen, self).__init__(**kwargs)
                  
                  
                  # Kivy app class
                  class Kivy(App):
                      w_MessageBox10_1 = "MAIN SCREEN"
                      w_MessageBox10_2 = "One golden glance of what should be"
                      w_MessageBox30_2 = "CHORUS"
                      w_MessageBox30_3 = "EXIT"
                  
                  
                      # exit button action   
                      def exit(self):
                          print "exiting... one shaft of light will show the way..."
                          p1.terminate()  # terminate Flask by pressing on cancel
                          exit(1)
                  
                  
                      # do magic button action
                      def do_magic(self):
                          # your code goes here or maybe not
                          print "***** it's a kind of magic *************************"
                  
                  
                      # Kivy UI builder file
                      def build(self):
                          sm = Builder.load_string("""
                  
                  ScreenManager
                      MainScreen:
                          size_hint: 1, .7
                          auto_dismiss: False
                          title: app.w_MessageBox10_1       
                          title_align: "center"
                  
                          BoxLayout:
                              orientation: "vertical"
                              Label:
                                  text: app.w_MessageBox10_2
                              BoxLayout:
                                  orientation: "horizontal"
                                  spacing: 10
                                  size_hint: 1, .5
                                  Button:
                                      text: app.w_MessageBox30_2  # DO MAGIC
                                      on_press:
                                          app.do_magic()
                                  Button:
                                      text: app.w_MessageBox30_3  # EXIT
                                      on_press:
                                          app.exit()
                  
                  
                          """)
                  
                          return sm
                  
                  
                  if __name__ == '__main__':    
                  
                      # #CTRL+C signal handler
                      signal.signal(signal.SIGINT, signal_handler)
                      signal.signal(signal.SIGTERM, signal_handler)
                  
                      global p1
                      p1 = Process(target=start_Flask)    # assign Flask to a process
                      p1.start()                          # run Flask as process
                      Kivy().run()                        # run Kivy UI
                  

                  更新要通过在 Kivy 中按下按钮来按需运行 Flask,我使用下面的脚本.

                  UPDATE To run Flask on demand by pressing a button in Kivy I use the script below.

                  #!/usr/bin/python2.7 python2.7
                  # -*- coding: utf-8 -*-
                  
                  # kivy modules first, if not Kivy may cause problems
                  import kivy
                  from kivy.app import App
                  from kivy.lang import Builder
                  from kivy.uix.label import Label
                  from kivy.uix.floatlayout import FloatLayout
                  from kivy.uix.screenmanager import ScreenManager, Screen
                  kivy.require('1.10.0')
                  
                  # common modules
                  import sys
                  import os
                  import time
                  import signal
                  from multiprocessing import Process
                  
                  # Flask modules
                  from flask import Flask
                  
                  # wsgi (Web Server Gateway Interface) modules
                  import eventlet
                  from eventlet import wsgi
                  
                  # async server setup
                  app = Flask(__name__)
                  
                  def signal_handler(signal, frame):
                      print " CTRL + C detected, exiting ... "
                      exit(0)
                  
                  
                  # kivy gui classes ######################################################     
                  class MainScreen(Screen):
                      def __init__(self, **kwargs):
                          self.name="MAIN SCREEN"
                          super(Screen, self).__init__(**kwargs)
                  
                  class MainApp(App):
                      MainScreenTitle = "MainScreen title"
                      MainScreenLabel = "MainScreen label"
                      MessageButtonEnter = "START"
                      MessageButtonExit = "EXIT"
                  
                      def start_Flask(self):
                          print("Starting Flask...")
                          wsgi.server(eventlet.listen(('', 5000)), app)     # deploy as an eventlet WSGI server
                  
                      def stop(self):
                          print "terminating Flask and exiting..."
                          global p1
                          p1.terminate()
                          exit(1)
                  
                      def start(self):
                          print "starting Flask as process..."
                          global p1
                          p1 = Process(target=self.start_Flask) # assign Flask to a process
                          p1.daemon = True
                          p1.start()  #launch Flask as separate process
                  
                      def build(self):
                          sm = Builder.load_string("""
                  
                  ScreenManager
                      MainScreen:
                          size_hint: 1, .7
                          auto_dismiss: False
                          title: app.MainScreenTitle       
                          title_align: "center"
                  
                          BoxLayout:
                              orientation: "vertical"
                              Label:
                                  text: app.MainScreenLabel
                              BoxLayout:
                                  orientation: "horizontal"
                                  spacing: 10
                                  size_hint: 1, .5
                                  Button:
                                      text: app.MessageButtonEnter  # start app
                                      on_press:
                                          app.start()
                                  Button:
                                      text: app.MessageButtonExit  # exit app
                                      on_press:
                                          app.stop()
                  
                          """)
                  
                          return sm
                  
                  
                  # main ################################################
                  if __name__ == '__main__':
                  
                      #CTRL+C signal handler
                      signal.signal(signal.SIGINT, signal_handler)
                      signal.signal(signal.SIGTERM, signal_handler)
                  
                      MainApp().run()   # run Kivy app
                  

                  这篇关于如何同时运行 kivy 和烧瓶应用程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:从另一个线程更改 kivy 属性 下一篇:如何使用python更改kivy语言中标签的文本

                  相关文章

                  最新文章

                2. <small id='aVQW6'></small><noframes id='aVQW6'>

                  <tfoot id='aVQW6'></tfoot>

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