检查小部件条目并在没有点击或按钮 GUI 的情况下继续

Check widget entry and proceed with no click nor button GUI

我正在创建 QR 码扫描器,它在将扫描的代码扫描到小部件条目后立即将其切片 - 以一种无需单击按钮或键盘按下即可继续操作的方式。用户只有一把条码扫描枪。

扫描的代码示例输入如下所示,并且结构始终相似(39 个字符中的 6 个子字符串):

AAAAA-BBBBB-CCC-DDDDDD-EEEEEE-FFFFFFFFFF

我希望我的代码:

1) 创建带有扫描代码入口和六个附加入口框的 GUI Tkinter 界面(见下图,link)

2) 在 "Scanned code" 条目中设置光标焦点

3) 检查 "Scanned code" 的小部件条目是否为空

4) 如果为false,则将扫描的字符串切片为除以符号'-'的子字符串,即一旦达到'-'。因此,我想将其自动分类为:

AAAAA

BBBBB

CCC 依此类推出现在相应的框中。

到目前为止,我已经完成了步骤 1) 和 2) - 请参阅图片和附件中的代码。

from Tkinter import *

root = Tk()
root.title('Scanner')

# create the top container
top_frame = Frame(root)
top_frame.pack( side = TOP )

scan_pcb=Label(top_frame,text='SCANNED CODE: ')
scan_pcb.grid(row=0,column=0)

pcb_entry=Entry(top_frame,background='white')
pcb_entry.grid(row=0,column=1)
pcb_entry.focus_set() 

# create the left container
left_frame = Frame(root)
left_frame.pack( side = LEFT )

A_label=Label(left_frame,text='A')
A_label.grid(row=0,column=0)
A_entry=Entry(left_frame,background='white')
A_entry.grid(row=0,column=1)

B_label=Label(left_frame,text='B')
B_label.grid(row=1,column=0)
B_entry=Entry(left_frame,background='white')
B_entry.grid(row=1,column=1)

C_label=Label(left_frame,text='C')
C_label.grid(row=2,column=0)
C_entry=Entry(left_frame,background='white')
C_entry.grid(row=2,column=1)

# create the right container
right_frame = Frame(root)
right_frame.pack( side = RIGHT )

D_label=Label(right_frame,text='D')
D_label.grid(row=0,column=2)
D_entry=Entry(right_frame,background='white')
D_entry.grid(row=0,column=3)

E_label=Label(right_frame,text='E')
E_label.grid(row=1,column=2)
E_entry=Entry(right_frame,background='white')
E_entry.grid(row=1,column=3)

E_label=Label(right_frame,text='F')
E_label.grid(row=2,column=2)
E_entry=Entry(right_frame,background='white')
E_entry.grid(row=2,column=3)

root.mainloop()

我目前制作的GUI图片

但是,我正在为步骤 3) 和 4) 苦苦挣扎。我做了一些研究并且 我在考虑使用

if len(entry_object.get()) 来自 this 主题,可能像:

if len(pcb_entry.get()) != 0
     #do something

#do something 部分是我正在与之抗争的部分。我也在考虑是否可以将其设为文本变量,这样我就可以存储它并在以后使用扫描的代码。 (?)

总而言之,就是无法正常使用,请问有没有人愿意帮助我?

仅供参考,我在这两个 python 编程方面仍然是一个新手,如果我再次重复这个问题,非常抱歉。

非常感谢。欣赏一下。

通常的做法是将条目与文本变量相关联:

scantext = StringVar()
pcb_entry=Entry(top_frame,background='white', textvariable=scantext)

然后,要拆分字符串,请使用 split()

scan_list = scantext.get().split('-')

这将在“-”字符处拆分条目中的文本并将结果存储在列表中。

要构建一个每秒检查一次扫描码的函数,您需要使用 after() 方法来管理一个每秒调用该函数的循环。

接下来最好将所有输入字段放在一个列表中。这将让我们使用字符串拆分的索引将数据放置在 reader.

的每个部分中

在下面的示例中,它将采用粘贴的字符串并将其拆分为 -。然后它将删除该字符串以免以后引起问题并将所有部分附加到其他输入字段。

我用这个例子测试过:# AAAA-BBBB-CCCC-DDDD-EEEE-FFFF:

import Tkinter as tk

root = tk.Tk()
root.title('Scanner')
entry_list = []

top_frame = tk.Frame(root)
top_frame.pack(side="top")
tk.Label(top_frame, text='SCANNED CODE: ').grid(row=0, column=0)
pcb_entry=tk.Entry(top_frame, background='white')
pcb_entry.grid(row=0, column=1)

left_frame = tk.Frame(root)
left_frame.pack(side="left")
right_frame = tk.Frame(root)
right_frame.pack(side="right")
tk.Label(left_frame, text='A').grid(row=0, column=0)
tk.Label(left_frame, text='B').grid(row=1, column=0)
tk.Label(left_frame, text='C').grid(row=2, column=0)
tk.Label(right_frame,text='D').grid(row=0, column=2)
tk.Label(right_frame,text='E').grid(row=1, column=2)
tk.Label(right_frame,text='F').grid(row=2, column=2)

for i in range(6):
    if i <= 2:
        entry_list.append(tk.Entry(left_frame, background='white'))
        entry_list[i].grid(row=i, column=1)
    else:
        entry_list.append(tk.Entry(right_frame, background='white'))
        entry_list[i].grid(row=i-3, column=3)

def check_entry():
    x = pcb_entry.get()
    section_list = []
    if x.strip() != "":
        pcb_entry.delete(0, "end")
        section_list = x.split("-")
    for ndex, section in enumerate(section_list):
        if ndex <= 5:
            entry_list[ndex].delete(0, "end")
            entry_list[ndex].insert(0, section)
    root.after(1000, check_entry)

check_entry()      
pcb_entry.focus_set() 
root.mainloop()

结果:

请记住,此代码假设您的条形码始终有 6 个段。如果您并不总是有 6 个段,则需要添加一个循环,在添加新数据之前删除列表中的所有输入字段数据。