tkinter 界面,显示图片,可点击放大

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()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值