Gui扫码拍照简易界面
界面上显示图片,双击图片可放大查看
from pathlib import Path
from scancamera import main_process
from ttkbootstrap import *
import tkinter as tk
from tkinter import scrolledtext,END
from tkinter import messagebox
import time
import logging
from PIL import Image,ImageTk
import threading
import chardet
def readDATfile(path):
tt = "NA"
with open(path, "rb")as f:
fixid = f.read()
f_charInfo = chardet.detect(fixid)
tt = fixid.decode(f_charInfo['encoding'])
return tt
def window_reflesh():
return window.after(100,window_reflesh)
class TextHandler(logging.Handler):
def __init__(self, logtext):
logging.Handler.__init__(self)
self.log = logtext
@staticmethod
def current_time():
current_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
return current_time
def emit(self, record):
msg = self.format(record)
logstr = str(TextHandler.current_time()) + " " + str(msg) + "\n"
self.log.insert('end',logstr)
self.log.see(END)
class Armani(threading.Thread):
def __init__(self):
pass
def changedevice(self):
def checkstr():
new_device = devicevar.get()
if not new_device.isdigit():
messagebox.showerror("ERROR","the new device is not isdigit")
elif not len(new_device) == 6:
messagebox.showerror("ERROR","the device lenght is eque 6")
else:
messagebox.showinfo("Tips","Alter the device is successful!")
chage_dev_ui.destroy()
device_id.set(new_device)
with open(device_path,'w')as f:
f.write(new_device)
window.after(100,window_reflesh)
chage_dev_ui = tk.Toplevel(window)
chage_dev_ui.geometry("300x200")
chage_dev_ui.title("change the deviceid")
devicevar = tk.StringVar()
tk.Label(chage_dev_ui, text='new device:',font=("", 15)).place(x=10,y=30)
tk.Entry(chage_dev_ui,textvariable=devicevar,width=10,font=("", 15)).place(x=120,y=30)
tk.Button(chage_dev_ui,text="confirm",height=3,width=10,command=checkstr).place(x=110,y=70)
def run(self):
t1 = threading.Thread(target=self.camera_scan)
t1.start()
def camera_scan(self):
# main_process(loger).camera_run()
# self.image_open = r"D:\LABELAOI\Test\20961189Q0005-M4N0CV11E064168_20210422084634_L_main_CAM_basler.jpg"
self.image_open = r"C:\Windows\Web\Screen\img102.jpg"
self.load_image(self.image_open)
viewimg.bind("<Double-Button-1>", lambda event: self.show_image(self.image_open))
def show_image(self,imagepath):
self.show_image_UI = tk.Toplevel(window)
self.show_image_UI.geometry("700x500")
png = Image.open(imagepath)
filename = Path(imagepath)
name = filename.name
self.show_image_UI.title(name)
canvas = tk.Canvas(self.show_image_UI, bg='white', highlightthickness=0)
canvas.pack(side=LEFT, anchor=CENTER, fill=BOTH, expand=YES)
self.image = ImageTk.PhotoImage(image=self.image_resize(image = png, event = None, window = self.show_image_UI, frame = canvas))
self.image1 = canvas.create_image(self.win_size(self.show_image_UI, canvas)[0] // 2, self.win_size(self.show_image_UI, canvas)[1] // 2, image=self.image)
self.show_image_UI.bind(sequence = '<Configure>', func = self.handler_adaptor(self.image_resize, image = png, window = self.show_image_UI, frame = canvas))
def load_image(self, filename):
self.image = Image.open(filename)
self.photo = ImageTk.PhotoImage(image=self.image_resize(image=self.image, event=None, window= window,frame = viewimg))
self.image1 = viewimg.create_image(self.win_size(window, viewimg)[0]//2, self.win_size(window, viewimg)[1] // 2, image=self.photo)
viewimg.bind(sequence='<Configure>', func=self.handler_adaptor(self.image_resize, image=self.image, window = window, frame = viewimg))
def image_resize(self,event=None, image=None, window=None, frame=None):
if event is None:
screen_width, screen_height = self.win_size(window, frame)
else:
screen_width, screen_height = event.width, event.height
raw_width, raw_height = image.size[0], image.size[1]
max_width, max_height = raw_width, screen_height
min_width = max(raw_width, max_width)
# 按照比例缩放
min_height = int(raw_height * min_width / raw_width)
# 第1次快速调整
while min_height > screen_height:
min_height = int(min_height * .9533)
# 第2次精确微调
while min_height < screen_height:
min_height += 1
# 按照比例缩放
min_width = int(raw_width * min_height / raw_height)
# 适应性调整
while min_width > screen_width:
min_width -= 1
# 按照比例缩放
min_height = int(raw_height * min_width / raw_width)
images = image.resize((min_width, min_height), Image.Resampling.LANCZOS)
if event is None:
return images
else:
global png
frame.delete(self.image1)
# viewimg.delete(self.image1)
png = ImageTk.PhotoImage(images)
frame.create_image(screen_width // 2, screen_height // 2, image=png)
# viewimg.create_image(screen_width // 2, screen_height // 2, image=self.image)
def win_size(self, window, frame):
"""
获取窗口大小,在没有bind事件时使用
"""
window.update()
width = frame.winfo_width()
height = frame.winfo_height()
return width, height
def handler_adaptor(self, fun, **kwds):
"""事件处理函数的适配器,相当于中介,那个event是从那里来的呢,我也纳闷,这也许就是python的伟大之处吧"""
return lambda event, fun=fun, kwds=kwds: fun(event, **kwds)
if __name__ == '__main__':
device_path = r"D:\LABELAOI\Config\DEVICE.INI"
webip_path = r"D:\LABELAOI\Config\WEBIP.INI"
TooVer = "Armani"
window = tk.Tk()
window.title(f'Armani test')
window.geometry("800x600")
title = tk.Label(window, text = 'show log Detials', font=("",15))
title.place(x=10, y=10)
viewimg = tk.Canvas(window, height =428, width = 490 , bg="green")
viewimg.place(x=10, y=40)
webver = tk.StringVar()
device_label = tk.Label(window, text='device:', font=("", 15))
web_label = tk.Label(window, text='webip:', font=("", 15))
deviceid = readDATfile(device_path)
webip = readDATfile(webip_path)
device_id = tk.StringVar()
device_id.set(deviceid)
device = tk.Button(window,textvariable=device_id,font=("",10),command=Armani().changedevice)
webserver = tk.Button(window,text=webip, width=25, height=1, anchor=tk.CENTER, font=("",10))
device_label.place(x=530, y=120)
device.place(x=600, y=120)
web_label.place(x=530, y=160)
webserver.place(x=600, y=160)
isnlabel = tk.Label(window, text="SCAN ISN:",font=("",15))
isnlabel.place(x=530, y=80)
isnentry = tk.Entry(window, width=25)
isnentry.place(x=630,y=85)
passcout = tk.Label(window, text = 'Pass:', font=("",15))
passcout.place(x=530, y=280)
errorcout = tk.Label(window, text='Error:', font=("", 15))
errorcout.place(x=530, y=320)
totalout = tk.Label(window, text='Total:', font=("", 15))
totalout.place(x=680, y=280)
rate = tk.Label(window, text='Rate:', font=("", 15))
rate.place(x=680, y=320)
logtext = scrolledtext.ScrolledText(window, width=60, height=5)
logtext.place(x=10, y=480)
loger = logging.getLogger("log")
loger.setLevel(logging.INFO)
Handler = TextHandler(logtext)
loger.addHandler(Handler)
Armani().run()
window.mainloop()