【发布时间】:2018-11-03 08:38:13
【问题描述】:
我想要实现的是类似于自助结账亭。
所以我想扫描一些条形码。并让 kivy 屏幕显示扫描的项目列表。当我没有要扫描的条形码时,可以按一个按钮并计算所有扫描物品的价格。
我认为最好的方法是使用 while 循环不断询问条形码扫描仪的输入。并且能够通过按下屏幕上的按钮来打破它。
问题是:当循环正在侦听输入时,屏幕上的所有按钮都挂起并且无法按下。所以假设我没有更多要扫描的条形码但因为循环仍在侦听对于输入,整个屏幕挂起。除了终止终端上的整个脚本之外,我什么也做不了。
我应该如何解决这个问题?
这些自助结账亭的工作原理是什么?他们的代码怎么样?
我读到了一些关于 kivy 时钟的建议。但即便如此,当它到达要求输入的代码部分时,它也会挂起。
“选择”、“子处理”或“线程”怎么样?你认为它会解决我的问题吗?但是,即使在阅读之后,我也不知道如何实现它。如果这是正确的方法,您能否建议一些示例代码?
我使用的是 Mac,python 2.7,最终将在带有 LCD 屏幕的树莓派上运行它。
这是我的循环:
def getItem():
while True:
answer = input('What is the box ID? ')
if answer == 999: # to break out from loop
break
elif type(answer) == int:
display on kivy screen
else:
print('Sorry I did not get that')
这是它在 kivy 上的样子:
更新代码:
这是在 kv 文件中:
<ScreenTwo>:
member_status: memberStatus
box_no: boxNo
text_in: textIn
BoxLayout:
Label:
id: memberStatus
text: ''
GridLayout:
rows: 3
padding: [100,500]
spacing: 10
BoxLayout:
Label:
id: boxNo
text: ''
BoxLayout:
TextInput:
id: textIn
write_tab: False
multiline: False
on_text_validate:
root.sayHello()
self.text = ""
self.focus = True
#also tried root.inputFocus()
BoxLayout:
CustButton:
text: "Done"
on_press:
root.manager.transition.direction = "right"
root.manager.current = 'menu'
root.clearField()
这是在 py 文件中:
class ScreenTwo(Screen):
text_in = ObjectProperty(None)
def inputFocus(self):
self.manager.screen_two.text_in.focus = True
【问题讨论】:
-
为什么使用终端而不使用TextInput?
-
@eyllanesc 会解决问题吗?
-
显然,我的问题是为什么要使用这样古老而丑陋的东西:input() 如果 GUI 提供现代而美丽的东西:TextInput() .输入是阻塞的,因为它们阻止程序前进并且不让 GUI 遵循其事件循环。事件循环是检查鼠标等其他事件所必需的。为您提供时钟解决方案的人不知道 GUI 应该如何工作,或者正在强制使用错误的解决方案。
-
@eyllanesc 哈哈哈,因为我是新手。好的,我有点理解你。但是我可以澄清一下:使用 textinput 列,当条形码扫描到 textinput 时,它是否可以检测到有输入并自动运行功能?
-
是的,条形码扫描仪在执行结束时生成一个输入 ("\n"),因此 input() 对您有效,您必须使用 on_text_validate 事件,但为此您必须设置多行属性为 False,更多信息请阅读以下内容:stackoverflow.com/questions/12037379/…