类实例作为kivy app中的进程:kivy app卡住了

时间:2016-02-16 11:48:45

标签: python kivy

我有一个存储设置和启动流程的界面。但是,一旦进程开始,我无法关闭所有内容,因为kivy在调用#! /usr/bin/env python """ Activate the touch keyboard. It is important that this part is on top because the global config should be initiated first. """ from kivy.config import Config Config.set('kivy', 'keyboard_mode', 'multi') # the main app from kivy.app import App # The Builder is used to define the main interface. from kivy.lang import Builder # The start screen is defined as BoxLayout from kivy.uix.boxlayout import BoxLayout # The pHBot class from phbot import pHBot # The pHBot is defined as process. Otherwise it would not be possible to use the close button. from multiprocessing import Process, Queue # Definition of the Main interface Builder.load_string(''' <Interface>: orientation: 'vertical' Button: text: 'Run pH-Bot' font_size: 40 on_release: app.run_worker() Button: text: 'Close pH-Bot' font_size: 40 on_release: app.stop_phbot() ''') # Interface as a subclass of BoxLayout without any further changes. This part is used by kivy. class Interface(BoxLayout): pass class SettingsApp(App): """ The settings App is the main app of the pHBot application. It is initiated by kivy and contains the functions defining the main interface. """ def build(self): """ This function initializes the app interface and has to be called "build(self)". It returns the user interface defined by the Builder. """ # A queque for the control all processes. self.qu_stop = Queue() # returns the user interface defined by the Builder return Interface() def run_worker(self): """ The pHBot application is started as a second process. """ bot = pHBot(self.qu_stop) phbot = Process(target=bot.ph_control()) # start the process phbot.run() def stop_phbot(self): self.qu_stop.put('STOP') if __name__ == '__main__': SettingsApp().run() 后卡住了。这是一个最小的例子:

phbot.py

第二个类位于名为import time class pHBot: def __init__(self, qu_stop_in): self.qu_stop_in = qu_stop_in def ph_control(self): while True: if self.qu_stop_in.full(): if self.qu_stop_in.get() == 'STOP': break print('Back and forth forever ...') time.sleep(2) 的文件中:

$(document).ready(function() {  
  // does not work 1:
  $('div#block_top_menu > ul.sf-menu > li > a.sf-with-ul').bind('click', false); // only direct children  

  // does not work 2:
  $('div#block_top_menu > ul.sf-menu > li > a.sf-with-ul').attr("href", "#"); // disable top-level links by replacing with #s

  // does not work 3:      
  $('div#block_top_menu > ul.sf-menu > li > a.sf-with-ul').click(function(){
            return false; // disable browser default when link is clicked
  })

});

我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

请注意,Processstart()开头。调用run()确实会立即从同一进程启动worker,因此它正在阻塞。因此,run_worker中的相关行应为:

    bot = pHBot(self.qu_stop)
    phbot = Process(target=bot.ph_control)
    # start the process
    phbot.start()

此外,在您的工作人员中,请勿检查Queue是否已满。相反,执行非阻塞get并处理Queue.Empty例外:

import Queue
...
    def ph_control(self):

        while True:
            try:
                item = self.qu_stop_in.get(False)
                if item == 'STOP':
                    break
            except Queue.Empty:
                print "Nothing to see"
            print('Back and forth forever ...')
            time.sleep(2)

答案 1 :(得分:0)

phbot = Process(target=bot.ph_control())

你正在调用 bot.ph_control - 这就是()语法的作用。我猜你需要传递函数本身(Process(target=bot.ph_control))),但我不熟悉多处理。