Kivy:如何在按钮 on_press 时调用某个函数
我正在制作一个生成票据的应用程序。生成票据的脚本已经完成。
当我按下“Generera”按钮(英文是“Generate”,意思是“生成”)时,它应该在终端打印出生成的票据。
一切都运行正常,但当我按下生成按钮时,我遇到了这个错误:
AttributeError: StockholmTicket 实例没有 call 方法
我不知道如何在按下 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()
4 个回答
0
你只需要输入 gen_btn.on_press = 你的函数
0
但是这样可以吗?
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
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.getMessage)
l = BoxLayout()
l.add_widget(gen_btn)
return l
class StockholmTicket(object):
def getMessage(self):
print "2. this is called on the method getMessage of StockholmTicket"
if __name__ == "__main__":
Fejkbiljett().run()
0
这里的“StockholmTicket()”是一个类,不能直接调用(除非你特别设置,但那是另一个话题)。试试这个代码,它会创建一个实例,用来保存要调用的函数。
gen_btn.bind(on_press=StockholmTicket().getMessage)
而不是
gen_btn.bind(on_press=StockholmTicket())
你还需要重新定义“getMessage”函数,因为它现在还不接受参数,但将来需要接受。试试这个:
class StockholmTicket():
def getMessage(self, * args):
希望这能帮到你?谢谢!
1
我不太确定为什么(我猜是因为这个类的定义方式),但是当你在一个不属于你绑定的类的方法上调用时,它是无法工作的。你可以在这个类里面创建一个方法,然后在另一个类中调用这个方法。就像这样:
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()