Проверьте запись виджета и продолжайте без нажатия кнопок и графического интерфейса - PullRequest
0 голосов
/ 20 ноября 2018

Я создаю сканер QR-кода, который нарезает отсканированный код сразу после сканирования его в запись виджета - таким образом, чтобы для продолжения операции не требовалось нажатия кнопки или нажатия клавиатуры.Все, что есть у пользователя, - это пистолет сканера штрих-кода.

Пример ввода отсканированного кода выглядит следующим образом и всегда структурирован аналогично (6 подстрок по 39 символов):

AAAAA-BBBBB-CCC-DDDDDD-EEEEEE-FFFFFFFFFF

Я хочу, чтобы мой код:

1) Создать графический интерфейс 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()

Изображение графического интерфейса, который я сделал до сих пор

picture of the GUI I have made so far

Однако я борюсь с шагами 3) и 4).Я провел некоторое исследование, и я подумывал, используя

if len(entry_object.get()) из этой темы, как-то, может быть, как:

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

Часть #do something - это то, что яЯ борюсь с.Я также подумал, возможно, сделать его текстовым, чтобы потом его можно было сохранить и потом работать с отсканированным кодом.(?)

В общем, я просто не могу заставить его работать должным образом, и мне было интересно, есть ли кто-то, кто хочет мне помочь?

К вашему сведению, я все еще новичок в программировании на Python, так что очень жаль, если я повторяю вопрос снова.

Большое спасибо.Цени это.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Чтобы построить функцию, которая будет проверять код сканирования раз в одну секунду, вам нужно использовать метод 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 сегментов, вам нужно будет добавить цикл, который удаляет все поля ввода данных в списке перед добавлением новых данных.

0 голосов
/ 20 ноября 2018

Обычный способ сделать это - связать запись с текстовой переменной:

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

Затем, чтобы разделить строку, используйте split()

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

, которая разделиттекст в записи с символами "-" и результаты сохраняются в виде списка.

...