应用程序在Python2和Python3的Windows上运行良好,但接收错误:无法导入android,并且按钮无响应

问题描述:

这是使用kivynumpy模块在python 2.7中编写的应用程序。按照以下步骤安装buildozerhttps://github.com/kivy/buildozer,我没有做sudo pip install https://github.com/kivy/buildozer/archive/master.zip。在Android buildozer android deploy run logcat部署应用程序后,我看到了日志一些错误:应用程序在Python2和Python3的Windows上运行良好,但接收错误:无法导入android,并且按钮无响应

10-10 17:44:49.497 19176 19207 I python : [ERROR ] [Image  ] Error reading file .\logo_example1.png 
10-10 17:44:49.498 19176 19207 I python : [WARNING] [Base  ] Unknown <android> provider 
10-10 17:44:49.498 19176 19207 I python : [INFO ] [Base  ] Start application main loop 
10-10 17:44:49.503 19176 19207 I python : [INFO ] [GL   ] NPOT texture support is available 
10-10 17:44:49.504 19176 19207 I python : 0 
10-10 17:44:49.504 19176 19207 I python : coloring 
10-10 17:44:49.505 19176 19207 I python : [ERROR ] [Base  ] Failed to import "android" module. Could not remove android presplash. 

问题:Image小部件不显示,而touch的按钮似乎并没有收到任何事件/响应。我可以对此反馈意见,谢谢。

当前部分解决:Image小部件现在显示,我改变了源地址从.\\logo_example1.pnglogo_example1.png

现有问题:Button小部件仍然无法响应android上的触摸,但在Windows上正常工作。

代码来测试开始和后退按钮:

这是main.kv

#: import Main main  
<[email protected]>: 
    font_size:30 
    size:100, 50 
<[email protected]>: 
    font_size:30 
    size:100, 50 
    text: "Back" 
    pos: Main.Wsize[0]+100, Main.Wsize[1]+100 
<mainWidget>: 
    id: main_widget 
<homeWidget>: 
    id: home_widget 
    padding : 200 
    Image: 
     id:logo 
     source: 'logo_example1.png' 
     center: 300, 450 
    CtmButton: 
     id: start_button 
     text: "Start" 
     center:300, 200 
     on_release: home_widget.startbutton_function() 
    ## I also have tried replacing this with on_touch_down 
    ## to see whether it will solve the problem 
<puzzleWidget>: 
    id: puzzle_widget 
    BackButton: 
     id: back_button_1 
     center: 100, 37.5 
     on_release: puzzle_widget.backbutton_function() 

这是main.py

import kivy 
from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.uix.label import Label 
from kivy.core.window import Window 
from kivy.uix.image import Image 
from kivy.core.image import ImageData 
from kivy.clock import Clock 
from kivy.graphics import Rectangle 
import time 
import math 
import itertools 
import numpy 
Window.clearcolor = (0.2, 0.25, 0.2, 0.5); col_dx = 0.005; y = list(Window.clearcolor); xstart = 0; 
Window.size = (600, 700); Wsize = Window.size; 
class mainWidget(Widget): 
    def __init__(self): 
     Widget.__init__(self); 
     home = homeWidget(); self.add_widget(home); 
class homeWidget(Widget): 
    def __init__(self): 
     Widget.__init__(self); 
     self.bg_animate(); 
    def printingsomething(self, dt): 
     print(dt); 
    def bg_animate(self): 
     global bg_anim 
     self.bg_anim = Clock.schedule_interval(self.printingsomething,1/40); 
     self.bg_anim(); 
    def startbutton_function(self): 
     print('start pressed'); 
     self.bg_anim.cancel(); 
     mainw.clear_widgets(); 
     mainw.add_widget(puzzleWidget()); 
class puzzleWidget(Widget): 
    def __init__(self): 
     Widget.__init__(self); 
     self.Bar1 = Image(size = [600, 75], color = list(Window.clearcolor)); self.Bar1.color[-1] = 0.8; self.Bar1.pos = [0, 700 - self.Bar1.size[1]]; 
     self.Bar2 = Image(size = [600, 75], color = list(Window.clearcolor)); self.Bar2.color[-1] = 0.8; self.Bar2.pos = [0, 0]; 
     #### ADD WIDGET(S): 
     self.add_widget(self.Bar1); self.add_widget(self.Bar2); 
     self.remove_widget(self.ids.back_button_1); self.add_widget(self.ids.back_button_1); 
    def backbutton_function(self): 
     print('back pressed'); 
     self.clear_widgets(); 
     mainw.clear_widgets(); 
     mainw.add_widget(homeWidget()); 
################## main window for the app ######################### 
class mainApp(App):  
    def build(self): 
     global mainw 
     mainw = mainWidget(); 
     return mainw 
#################################################################### 
mainApp = mainApp() 
mainApp.run(); 
+0

您可能需要在buildozer.spec中添加'android'到您的需求。 – Tshirtman

+0

@Tshirtman请问为什么..?我认为官方步骤将足够紧凑.. – Arief

+0

@Tshirtman我试过了,而且按钮仍然没有收到任何回应。 – Arief

无法导入 “机器人”模块。

此msg与图像无关。如果您不明确使用android模块,它不会影响您的项目。您需要在日志中避免此行的所需操作是在buildozer.spec内添加android

读取文件错误。\ logo_example1.png

此错误表示图像不能被发现。我不知道.\\logo_example1.png有什么问题,但最好是使用绝对路径并忘记问题。

import os 

root_dir = os.path.dirname(os.path.abspath(__file__)) 
img_rel = 'logo_example1.png' 
img_abs = os.path.join(root_dir, img_rel) 

print(img_abs) 

UPD:

问题的紧迫的是与此相关的线 - Window.size = (600, 700)。删除它,一切都会工作。

看起来像改变Window.size以某种方式打破了kivy接触点检测。如果您想在Windows上更改窗口大小,use配置或换行Window.size更改为platform check

+0

谢谢,我编辑了这篇文章,'图片'小部件现在显示。剩下的问题是'Button'小部件对手机的触摸没有反应。 – Arief

+0

@Arief你能提供代码来重现问题吗? –

+0

我已编辑帖子.. @MikhailGerasimov – Arief