【发布时间】:2018-05-23 08:40:57
【问题描述】:
我想要实现的目标:当屏幕从 ScreenOne 切换到 ScreenTwo 时,运行“while 循环”函数,直到 ScreenTwo 上的按钮被按下并中断循环。
此函数应该运行并接收来自连接到我的计算机的条形码扫描仪的输入(意思是,输入是条形码)并使用扫描的条形码数量更新 ScreenTwo 上的标签。
然后,一旦我没有要扫描的条形码,请按 ScreenTwo 上的“完成”按钮 - 这应该发送输入“999”以中断循环功能。
我如何尝试在屏幕切换时运行函数:使用'on_enter'
class ScreenTwo(Screen):
def on_enter(self):
getStatus()
updatePoints()
我面临的问题:
- 屏幕从 ScreenOne 切换到 ScreenTwo,并且函数运行(我看到它发生在 Mac 终端上)但无法按下 ScreenTwo 上的按钮(Mac 色轮旋转)。
- 我还没有弄清楚如何让“完成”按钮将输入“999”发送到函数以中断循环。
如何解决 1?
我如何实现 2?
这里分别是 ScreenOne 和 ScreenTwo 的截图:
这是 returnStation2.py 文件
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
def getStatus():
while True:
answer = input('What is the box ID? ')
if answer == 999: #LOOPS BREAK WHEN INPUT IS 999
break
elif type(answer) == int:
do something
else:
print('Sorry I did not get that')
def updatePoints():
do something
class ScreenManagement(ScreenManager):
screen_one = ObjectProperty(None)
screen_two = ObjectProperty(None)
class ScreenOne(Screen):
member_status = ObjectProperty(None)
def backspace(self, textString):
newTextString = textString[0:-1]
self.display.text = newTextString
def getPoints(self, phoneNumber):
self.manager.screen_two.member_status.text = phoneNumber
class ScreenTwo(Screen):
input_text = ObjectProperty(None)
def on_enter(self):
getStatus()
updatePoints()
def clearField(self):
self.manager.screen_one.input_text.text = ""
class ReturnStationLayout2App(App):
def build(self):
return ScreenManagement()
if __name__ == '__main__':
ReturnStationLayout2App().run()
这里是returnStationLayout2.kv
“完成”按钮(在 ScreenTwo 中)位于脚本底部。
屏幕切换到ScreenTwo时无法按下。 并且我希望按下时可以输入'999'来打破正在运行的循环功能。
<ScreenManagement>:
screen_one: screen_one
screen_two: screen_two
ScreenOne:
id: screen_one
name: 'menu'
ScreenTwo:
id: screen_two
name: 'settings'
<CustButton@Button>:
font_size: 32
<ScreenOne>:
input_text : entry
GridLayout:
id: numberPad
rows: 5
padding: [300,200]
spacing: 10
# Where input is displayed
BoxLayout:
Label:
text: "+65"
font_size: 50
size_hint: 0.2, 1
TextInput:
id: entry
font_size: 50
multiline: False
padding: [20, ( self.height - self.line_height ) / 2]
BoxLayout:
spacing: 10
CustButton:
text: "1"
on_press: entry.text += self.text
CustButton:
text: "2"
on_press: entry.text += self.text
CustButton:
text: "3"
on_press: entry.text += self.text
CustButton:
text: "DEL"
on_press: root.backspace(entry.text)
BoxLayout:
spacing: 10
CustButton:
text: "4"
on_press: entry.text += self.text
CustButton:
text: "5"
on_press: entry.text += self.text
CustButton:
text: "6"
on_press: entry.text += self.text
CustButton:
text: "AC"
on_press: entry.text = ""
BoxLayout:
spacing: 10
CustButton:
text: "7"
on_press: entry.text += self.text
CustButton:
text: "8"
on_press: entry.text += self.text
CustButton:
text: "9"
on_press: entry.text += self.text
CustButton:
text: "Enter" #HERE IS THE ENTER BUTTON
on_press:
root.manager.transition.direction = 'left'
root.manager.transition.duration = 1
root.manager.current = 'settings'
root.getPoints(entry.text)
BoxLayout:
spacing: 10
Label:
text: ""
CustButton:
text: "0"
on_press: entry.text += self.text
Label:
text: ""
Label:
text: ""
<ScreenTwo>:
member_status: memberStatus
BoxLayout:
Label:
id: memberStatus
text: ''
GridLayout:
rows: 3
padding: [100,500]
spacing: 10
BoxLayout:
Label:
text: "You have scanned:"
BoxLayout:
CustButton:
text: "Done" #THIS IS THE BUTTON I HOPE TO BE ABLE TO BREAK THE LOOP FUNCTION
on_press:
root.manager.transition.direction = "right"
root.manager.current = 'menu'
root.clearField()
【问题讨论】:
-
一旦你开始 while 循环,它会一直运行,直到你打破它,并阻止所有其他行为。这意味着,您将无法在代码运行时单击该按钮,并且您将无法更新屏幕。您可以尝试创建一个独立于应用程序其他部分的单独线程,但我相信 Python 的
input()会因其创建方式而阻塞所有内容(我会感谢有人支持我)。除此之外,当我运行您的代码时,该按钮被其他元素覆盖,我必须首先将您的网格布局的填充更改为 [100, 100]。 -
@Kacper Floriański 有什么方法可以让循环监听来自屏幕(按钮)和我的条形码扫描仪的输入吗?我想要实现的是用户即将扫描任意数量的条形码(这就是为什么循环监听更多输入(如果有的话)),一旦他完成扫描,按下完成按钮并跳出循环。有什么办法吗?
-
最简单的方法是添加一个“添加”按钮,必须按下该按钮才能添加条形码。请注意,即使使用 python 的
input()也需要您在每次输入后按回车键。如果条形码是从键盘输入的,您可以要求用户以特定格式输入它们,然后简单地从那里提取值。如果它们是图形对象,您可以在不按任何按钮的情况下进行操作,例如让用户在不移动手机的情况下等待 1 秒才能扫描条形码。 -
@KacperFloriański 我在想图书馆借阅亭。它如何允许用户扫描他们打算借阅的任意数量的图书,然后在自助服务终端的屏幕上单击“完成”以处理所有已扫描图书的借阅?
标签: python python-2.7 kivy