Skip to main content
 首页 » 编程设计

android之Kivy:如何在按钮 on_press 上调用某些东西

2025年05月04日49开发

我正在制作一个生成票证的应用程序。生成脚本已经完成。

当我按下按钮“Genera”(英文为“Generate”)时,它应该打印生成的票据(目前在终端中)。

它全部运行但是当我按下生成按钮时我得到这个错误:

AttributeError: StockholmTicket instance has no call method

我不知道如何在 gen_btn 新闻上调用 StockholmTicket,非常感谢任何帮助。

代码如下:

from kivy.app import App 
 
from kivy.uix.button import Button 
from kivy.uix.boxlayout import BoxLayout 
 
from datetime import datetime, timedelta 
import random 
 
 
class Fejkbiljett(App): 
 
    def build(self): 
        gen_btn = Button(text='Generera', 
                         size_hint=(.90, .10), 
                         pos=(5, 5), 
                         font_size=21) 
 
        gen_btn.bind(on_press=StockholmTicket()) 
 
        l = BoxLayout() 
 
        l.add_widget(gen_btn) 
 
        return l 
 
 
class StockholmTicket(): 
 
    def getMessage(): 
        # gNumbers 
        gNumbers = random.randint(100, 999) 
        gNumbers = str(gNumbers) 
 
        gLetters = 'EAOXE' 
        gLetters = gLetters * 2 
        gLetters = ''.join(random.sample(gLetters, len(gLetters))) 
        gLetters2 = 'EAOXA' 
        gLetters2 = gLetters2 * 2 
        gLetters2 = ''.join(random.sample(gLetters2, len(gLetters2))) 
        gLetters3 = 'EAOXA' 
        gLetters3 = gLetters3 * 2 
        gLetters3 = ''.join(random.sample(gLetters3, len(gLetters3))) 
 
        sCode = '123456789123456' 
        sCode = ''.join(random.sample(sCode, len(sCode))) 
        sCode = sCode[:6] + ' ' + sCode[6:] 
 
        iPrice = '20' 
        sPriceText = 'Red pris' 
        sPricetype = 'R' 
        mZones = 'A' 
        mTime = datetime.now() 
        mTime = mTime + timedelta(hours=1, minutes=15) 
        mTime = str(mTime) 
        mTime = mTime[11:16] 
        mDate = str(datetime.now()) 
        mDate = mDate[:10] 
 
        print((sPricetype + "-" + mZones + " " + mTime + " " 
              + gNumbers + "\n\n" 
 
              + gLetters + "\n" 
              + gLetters2 + "\n" 
              + gLetters3 + "\n" 
              + "EEEEEEEEEE\n\n" 
 
              + "SL biljett giltig till " + mTime + ", " + "\n" + mDate + "\n" 
              + sPriceText + " " + iPrice + " kr ink 6% moms\n" 
 
              + sCode + "\n" 
              + "m.sl.se")) 
 
    getMessage() 
 
if __name__ == "__main__": 
    Fejkbiljett().run() 

请您参考如下方法:

不确定为什么(我猜是他定义类的方式),但是当调用不属于您正在绑定(bind)的同一类的方法时它不起作用。您可以在类中创建一个方法,然后在另一个类中调用该方法。像这样:

from kivy.app import App 
 
from kivy.uix.button import Button 
from kivy.uix.boxlayout import BoxLayout 
 
 
class Fejkbiljett(App): 
 
    def build(self): 
        self.gen_btn = Button(text='Generera', 
                         size_hint=(.90, .10), 
                         pos=(5, 5), 
                         font_size=21) 
        self.gen_btn.bind(on_press=self.getMessageFejkbiljett) 
        l = BoxLayout() 
        l.add_widget(self.gen_btn) 
        return l 
 
    def getMessageFejkbiljett(self, *args): 
        print "1. this is called on the method getMessageFejkbiljett of Fejkbiljett" 
        st = StockholmTicket() 
        st.getMessage(self) 
 
 
class StockholmTicket(): 
 
    def getMessage(self, source): 
        source.gen_btn.text = "the event was called" 
        print "2. this is called on the method getMessage of StockholmTicket" 
 
if __name__ == "__main__": 
    Fejkbiljett().run()