检查窗口小部件条目,并且不单击按钮也不进行GUI

时间:2018-11-20 10:35:06

标签: python-3.x user-interface tkinter barcode-scanner scanning

我正在创建QR Code扫描仪,它会在将扫描的代码扫描到小部件条目后立即对其进行切片-无需进行任何单击按钮或键盘操作即可进行操作。用户所拥有的只是条码扫描枪。

扫描的代码示例输入看起来像这样,并且始终具有相似的结构(39个字符中的6个子字符串):

AAAAA-BBBBB-CCC-DDDDDD-EEEEEE-FFFFFFFFFF

我希望我的代码:

1)创建GUI Tkinter界面,其中包含扫描代码条目和六个其他输入框(参见图片,下面的链接)

2)在“扫描的代码”条目中设置光标焦点

3)检查“扫描代码”的小部件条目是否为空

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图片

picture of the GUI I have made so far

但是,我正在努力进行步骤3)和4)。我做了一些研究, 我在考虑使用

if len(entry_object.get())来自this主题,也许像这样:

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

#do something部分是我所要争取的。我也在考虑也许将其设置为文本变量,以便以后可以存储它并使用扫描的代码。 (?)

总而言之,我只是无法使其正常工作,我想知道是否有人愿意帮助我?

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

非常感谢。赞赏。

2 个答案:

答案 0 :(得分:0)

执行此操作的通常方法是将条目与textvariable关联:

opt

然后,使用0b11 & 0b01 = 0b01

分割字符串
0b11 & 0b10 = 0b10

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

答案 1 :(得分:0)

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

接下来,最好将所有输入字段放在列表中。这将使我们能够使用字符串拆分的索引将数据放置在阅读器的每个部分。

在下面的示例中,它将粘贴一个字符串并在-处进行分割。然后它将删除该字符串,以免以后不会引起问题,并将所有部分附加到其他输入字段。

我通过以下示例进行了测试:# 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()

结果:

enter image description here

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