簡體   English   中英

如何以正確的方式將 sqllite3 中的圖像和值插入 tkinter treeview?

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

我正在嘗試從 sqllite3 數據庫中獲取圖像和一些值並將它們插入到 Tkinter Treeview 中,但是我遇到了 position 的問題,因此如何正確放置圖像的每個列的大小值在正確的位置並調整圖像大小,使其適合右列。

很抱歉代碼太長,但我正在努力澄清這個問題

例子: 在此處輸入圖像描述

我的代碼腳本:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM