如何以正确的方式将 sqlite3 中的图像和值插入到 tkinter 树视图中?

How to insert image and values from sqllite3 into tkinter treeview the right way?

我正在尝试从 sqllite3 数据库中获取图像和一些值并将它们插入到 Tkinter Treeview 中,但是我在正确列上的记录位置以及图像大小方面遇到了问题,那么如何将每个值放在正确的位置并调整图像大小,使其适合正确的列。

很抱歉代码太长,但我正在努力澄清问题

示例:

我的代码脚本:

 #load image
def filedialogs(self):
    global filename, img, images
    f_types = [("png", "*.png"), ("jpg", "*.jpg"), ("Allfile", "*.*")]
    filename = filedialog.askopenfilename(filetypes=f_types)
    img = Image.open(filename)
    img = img.resize((365, 270), Image.ANTIALIAS)
    img = ImageTk.PhotoImage(img)

  # added infos,image into db
 def Add_car(self):
       global img, filename
       self.fob = open(filename, 'rb')
      self.fob = self.fob.read()
      entities = (self.makecb.get(),self.modelcb.get(), self.Yearcb.get(),self.lincesplatenum.get(),self.price.get(),self.price.get())

    self.con = sqlite3.connect('car dealership.db')
    self.cursorObj = self.con.cursor()

    self.cursorObj.execute(
        '''INSERT INTO Vechicle_info(carmake, carmodel, caryear,carlincesplatenum, image,price) VALUES(?,?,?,?,?,?)''',
        entities)
    self.con.commit()
    self.cursorObj.close()
    
 def expenses(self):   
       self.carstoselecet_expensetree = ttk.Treeview(self.cartoselectframe,columns=["image", "price", "licenseplate", "year","model", "brand"])
       self.carstoselecet_expensetree.pack()

    self.carstoselecet_expensetree.heading("brand", text="car brand")
    self.carstoselecet_expensetree.heading("model", text="car model")
    self.carstoselecet_expensetree.heading("year", text="car year")
    self.carstoselecet_expensetree.heading("licenseplate", text="car licenseplate")
    self.carstoselecet_expensetree.heading("price", text="car price")
    self.carstoselecet_expensetree.heading("image", text="car image")

    self.carstoselecet_expensetree.column("brand", width=125)
    self.carstoselecet_expensetree.column("model", width=100)
    self.carstoselecet_expensetree.column("year", width=100)
    self.carstoselecet_expensetree.column("licenseplate", width=100)
    self.carstoselecet_expensetree.column("price", width=100)
    self.carstoselecet_expensetree.column("image",width=500)
  
    self.cursorObj = self.con.cursor()
    self.my_row=self.cursorObj.execute('SELECT image, price, carlincesplatenum, caryear, carmodel, carmake FROM Vechicle_info')
    self.cars_expense_output = self.cursorObj.fetchall()
  
    # fetch values from db and insert them into treeview
    self.imglist=[]
    for record in self.cars_expense_output:
       img=ImageTk.PhotoImage(data=record[0])
       self.carstoselecet_expensetree.insert("",END,image=img,values=record[1:])
       self.imglist.append(img)

    self.con.commit()

有几个问题:

  • 插入数据库时​​使用原始图像(从文件读取)而不是调整大小后的图像
  • self.price.get()entities 中使用了两次,第一个应该是 self.fob 而不是
  • image 列应删除,因为图像显示在 树列“#0”
  • 您需要将树视图的 rowheight 设置为图像的高度

以下是修复上述问题的修改代码:

#load image
def filedialogs(self):
    f_types = [("png", "*.png"), ("jpg", "*.jpg"), ("Allfile", "*.*")]
    filename = filedialog.askopenfilename(filetypes=f_types)
    img = Image.open(filename)
    img = img.resize((365, 270), Image.ANTIALIAS)
    # save the resized image to self.fob
    with io.BytesIO() as f:
        img.save(f, 'PNG')
        self.fob = f.getvalue()

# added infos,image into db
def Add_car(self):
    # changed first self.price.get() to self.fob
    entities = (self.makecb.get(), self.modelcb.get(), self.Yearcb.get(), self.lincesplatenum.get(), self.fob, self.price.get())

    self.con = sqlite3.connect('car dealership.db')
    self.cursorObj = self.con.cursor()

    self.cursorObj.execute(
        '''INSERT INTO Vechicle_info (carmake, carmodel, caryear, carlincesplatenum, image, price) VALUES (?,?,?,?,?,?)''',
        entities)
    self.con.commit()
    self.cursorObj.close()

def expenses(self):
    # removed image column
    self.carstoselecet_expensetree = ttk.Treeview(self.cartoselectframe,columns=["price", "licenseplate", "year","model", "brand"])
    self.carstoselecet_expensetree.pack()

    # set treeview rowheight option
    s = ttk.Style()
    s.configure('Treeview', rowheight=270)

    self.carstoselecet_expensetree.heading("brand", text="car brand")
    self.carstoselecet_expensetree.heading("model", text="car model")
    self.carstoselecet_expensetree.heading("year", text="car year")
    self.carstoselecet_expensetree.heading("licenseplate", text="car licenseplate")
    self.carstoselecet_expensetree.heading("price", text="car price")
    self.carstoselecet_expensetree.heading("#0", text="car image") # changed "image" to "#0" (tree column)

    self.carstoselecet_expensetree.column("brand", width=125)
    self.carstoselecet_expensetree.column("model", width=100)
    self.carstoselecet_expensetree.column("year", width=100)
    self.carstoselecet_expensetree.column("licenseplate", width=100)
    self.carstoselecet_expensetree.column("price", width=100)
    self.carstoselecet_expensetree.column("#0",width=400) # changed "image" to "#0" (tree column)

    self.cursorObj = self.con.cursor()
    self.my_row = self.cursorObj.execute('SELECT image, price, carlincesplatenum, caryear, carmodel, carmake FROM Vechicle_info')
    self.cars_expense_output = self.cursorObj.fetchall()

    # fetch values from db and insert them into treeview
    self.imglist=[]
    for record in self.cars_expense_output:
        img=ImageTk.PhotoImage(data=record[0])
        self.carstoselecet_expensetree.insert("",END,image=img,values=record[1:])
        self.imglist.append(img)

    self.con.commit()